【问题标题】:Loop through filenames with numbers in alphanumeric order for OSX terminal为 OSX 终端循环遍历带有字母数字顺序的数字的文件名
【发布时间】:2016-10-10 01:29:39
【问题描述】:

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

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

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

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

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

但是,我希望顺序为:2_file.txt10_file.txt11_file.txt21_file.txt

【问题讨论】:

  • 另一个应按字母顺序排列:Does bash's * match files in alphanumeric order?。至少在 GNU Bash 中
  • 我的文件以数字10_file.txt 开头出现在2_file.txt 之前,显然是按文件名中的字符排序的。我现在将调整我的问题。
  • 嗯,这意味着它是按字母顺序排序的。
  • 那么字母排序不是我想要的。是字母数字排序吗?这个有名字吗?
  • 是的。在我发布的链接中,Bash 会扫描每个单词中的字符“*”、“?”和“[”。如果出现这些字符之一,则该单词被视为一个模式,并替换为按字母顺序排列的与该模式匹配的文件名列表

标签: bash macos terminal


【解决方案1】:

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

3.5.8 文件名扩展

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

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

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 &lt; &lt;(command)

    是一个process substitution,将其输出注入while 循环。

【讨论】:

  • 你也需要-mindepth 1——或者-type f如果只有文件——以避免当前目录。
  • @andlrc 是的,关于mindepth 的好点。我刚刚更新以更好地解释这一点。谢谢
猜你喜欢
  • 2015-05-14
  • 2015-01-04
  • 2020-02-14
  • 1970-01-01
  • 2021-06-05
  • 2011-11-10
  • 1970-01-01
  • 2013-08-02
  • 2012-08-31
相关资源
最近更新 更多