按数字顺序处理文件

时间:2017-04-17 08:41:51

标签: bash shell sh

这个脚本所在的位置,我有多个子目录,我想在其中对所有内容运行一个命令。内容也按升序编号。在包含10个以上项目的文件夹中使用for f in *会导致名为1011的文件在1..9之前顺序出现。

此外,每个子目录中的文件数量在6到12个项目之间变化,所以我不认为我可以简单地执行像{1..12}这样的范围操作,因为我想避免警告/错误关于不存在的文件。

问题:有没有办法强制或修改for循环,以便在不知道文件夹内容数量的情况下迭代文件夹的整个内容时维持升序数字顺序?

term=""                  # hold accumulated filenames

for d in */ ; do         # iterate over sub-directories
    cd $d
    for f in * ; do      # iterate over files in sub-directory
        term="$term $f"
    done
    # run a command using the string $term
    term=""
    cd ..
done

附注:我标记了shshellbash,因为它们都适用于此问题。我在添加两个标记之前阅读Difference between sh and bash,以确保它是一个有效的选择,即使存在一些语法/可移植性变体等。

1 个答案:

答案 0 :(得分:1)

您可以使用ls选项-v。来自man ls

  

-v natural sort of (version) numbers within text

如果将内循环更改为

for f in `ls -v` ; do      # iterate over files in sub-directory
    term="$term $f"
done

ls的结果将按数字顺序排序。

另一个选项是sort,来自man sort

  

-g, --general-numeric-sort compare according to general numerical value

lssort -g管道结果会得到相同的结果。

修改

由于使用ls的输出来获取文件名is a bad idea,因此请考虑使用find,例如。

for f in `find * -type f | sort -g`; do
    ...