例如有一个目录有20个文件。
# mkdir test
# touch test/{11..30}
# ls test
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
还有一个简单的循环来重命名文件。它在每个文件名前面添加一个数字 9。
#!/bin/sh
dir='/tmp/test'
for fullpath in "$dir"/* ; do
filename=${fullpath##*/}
mv "$fullpath" "${dir}/9${filename}"
done
然后运行脚本。
# ./prog.sh
# ls test
911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
在此测试中,修改文件名是安全的。
但是,如果目录中有更多文件(或者存在递归目录),前几个重命名(即 911、912、913...)可能会被排序到列表的末尾。然后它们可能会再次被送入循环,这使得它成为无限循环,不断添加前缀数字 9?我想这取决于通配符的特性。如果有最大数量的物品可以携带。如果超过最大值,是否会延迟扩容。
在 posix 目录循环中修改文件名总是安全的吗?
但是,
globbing 会扩展一次 到由 for
循环重复使用的列表中。根据POSIX规范,
in
后面的“单词列表”被扩展以生成项目列表。
for name [ in [word ... ]]
do
compound-list
done
这个:
for name in ./* ; do ...
相当于这个(如果“11,12,13”是通配模式找到的文件):
for name in "11" "12" "13" ; do ...
For
循环迭代列表,而不是通配模式。在正常操作期间,通配模式恰好在
for
循环到达列表之前计算为列表。