BASH:如何按排序顺序循环所有文件

Per*_*ika 43 sorting bash loops

我使用以下命令循环目录中的所有文件:

for i in *.fas; do some_code; done;
Run Code Online (Sandbox Code Playgroud)

但是,我收到这样的订单:

vvchr1.fas
vvchr10.fas
vvchr11.fas

而不是vvchr1.fas,vvchr2.fas,vvchr3.fas,什么是数字顺序.

我尝试过sort命令,但没有成功.

cat*_*che 86

for i in `ls *.fas | sort -V`; do some_code; done;
Run Code Online (Sandbox Code Playgroud)

其中,sort -V根据做man sort一个版本排序-一个自然排序文本内(版本)号

同样只使用ls:

for i in `ls -v *.fas`; do echo $i; done;
Run Code Online (Sandbox Code Playgroud)

  • @Ben我总是被人们提出'但如果你的文件名中的新行......'的事情搞糊涂了.这么多人如何获得文件名换行?我从未遇到过这种情况. (11认同)
  • 如果你的文件名中有换行符,那看起来很可疑:http://mywiki.wooledge.org/ParsingLs (3认同)
  • @ButtleButkus,如果有人试图利用您代码中的漏洞,并且可以通过有意*创建*目录创建一个名为`/ tmp / $'\ n'/ etc / passwd $'\ n'/ hi`的目录来实现,如果任何在`/ tmp`(或上载目录,或任何其他没有良好保护的位置)上迭代的代码都需要妥善处理。很少发生的事情仍然是发生的事情-我在职业生涯中看到的最糟糕的数据丢失事件是由于缓冲区溢出将大量随机垃圾转储到文件名中而引起的,甚至没有恶意。 (3认同)
  • 这会导致带有“空格”文件的问题。 (2认同)

gta*_*gil 12

使用选项sort -g它根据一般数值进行比较

 for FILE in `ls ./raw/ | sort -g`; do echo "$FILE"; done
Run Code Online (Sandbox Code Playgroud)

0.log 1.log 2.log ... 10.log 11.log

仅当文件名是数字时这才有效。如果它们是字符串,您将按字母顺序获得它们。例如:

 for FILE in `ls ./raw/* | sort -g`; do echo "$FILE"; done
Run Code Online (Sandbox Code Playgroud)

原始/0.log 原始/10.log 原始/11.log ... 原始/2.log