为OSX终端循环使用字母数字顺序的数字的文件名

时间:2016-06-09 11:51:57

标签: bash macos terminal

在OSX终端中,我们如何以字母数字顺序循环以数字开头的文件?

到目前为止,我有这个bash脚本,它以无明显顺序循环遍历文件:

FILES=/Users/somefolder/*.txt
    for f in $FILES
do
    echo $f
done

此外,我的文件以数字开头,例如,当我在-v中使用ls开关时,它们列为:

10_file.txt 
11_file.txt
21_file.txt 
2_file.txt 

但是,我希望订单为:2_file.txt10_file.txt11_file.txt21_file.txt

1 个答案:

答案 0 :(得分:1)

您正在按字母顺序排序。来自Bash Reference Manual # 3.5.8. Filename expansion

  

3.5.8文件名扩展

     

分词后,除非设置了-f选项(参见Set   内置),Bash扫描每个单词的字符'*','?'和'['。   如果出现其中一个字符,则该字被视为a   模式,并替换为按字母顺序排序的文件名列表   匹配模式。

要获得数字排序,请使用while循环,该循环由find的结果提供,您可以按数字排序:

while IFS= read -r file
do
   echo "$file --"
done < <(find /your/path -maxdepth 1 -mindepth 1 -type f -printf "%f\n" | sort -n)

那是:

  • find /your/path -maxdepth 1 -mindepth 1 -type f

    获取/your/path中的元素,这些元素是一个不经过子目录的文件。

  • printf "%f"

    仅打印文件名。

  • sort -n

    按数字排序

  • while ... do; ... done < <(command)

    process substitution是否在while循环中注入其输出。