这个脚本所在的位置,我有多个子目录,我想在其中对所有内容运行一个命令。内容也按升序编号。在包含10个以上项目的文件夹中使用for f in *
会导致名为10
或11
的文件在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
附注:我标记了sh
,shell
和bash
,因为它们都适用于此问题。我在添加两个标记之前阅读Difference between sh and bash,以确保它是一个有效的选择,即使存在一些语法/可移植性变体等。
答案 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
从ls
到sort -g
管道结果会得到相同的结果。
修改
由于使用ls
的输出来获取文件名is a bad idea,因此请考虑使用find
,例如。
for f in `find * -type f | sort -g`; do
...