在我的 Mac 上,我正在编写终端脚本,对文件夹中的某些文件进行增量重命名。这些文件末尾有一个数字,但从自上而下的方法来看,它们是按顺序排列的:
foobar101.png
foobar107.png
foobar115.png
foobar121.png
foobar127.png
foobar133.png
foobar141.png
foobar145.png
foobar151.png
foobar155.png
当我创建并运行循环时,它可以工作:
DIR="/customlocation/on/mac"
add=1;
for thefile in $(find $DIR -name "*.png" ); do
cd $DIR
mv -v "${thefile}" foobar"${add}".png
((add++))
done
但是,当它运行增量时,它并不符合预期:
foobar101.png -> need foobar1.png but is foobar10.png
foobar107.png -> need foobar2.png but is foobar3.png
foobar115.png -> need foobar3.png but is foobar4.png
foobar121.png -> need foobar4.png but is foobar2.png
foobar127.png -> need foobar5.png but is foobar9.png
foobar133.png -> need foobar6.png but is foobar6.png
foobar141.png -> need foobar7.png but is foobar1.png
foobar145.png -> need foobar8.png but is foobar5.png
foobar151.png -> need foobar9.png but is foobar8.png
foobar155.png -> need foobar10.png but is foobar7.png
我尝试过在 SO、Linux/Unix、Ask Ubuntu 和 SuperUser 上搜索,但我没有看到任何可以解决控制增量问题的问题,而且我不知道这是否是我应该特别关注的问题。那么,我如何从最低的数字/文件名控制增量,而不是 Mac 可能随机地以增量重命名,以便获得所需的输出?
编辑:
在comment之后来自 Etan 我正在研究最后的数值,其中一些文件名为 foobarXXXX ,这就是问题所在。下面的答案虽然很棒,而且是我将研究的新方法,但由于其他一些文件,仍然会产生相同的结果。如果我删除所有 foobarXXXX
文件,只保留值为 foobarXXX
的文件,我的代码和 fedorqui 的答案中的代码将起作用。有没有一种方法可以在循环过程中定位这个目标,或者我是否必须定位所有名称并测试以查看值的长度并进行相应调整?
最佳答案
您不能依赖 find
命令的顺序,该命令使用 the order that the VFS gives them to it in .
您可能想对其进行排序
:
DIR="/customlocation/on/mac"
add=1;
while IFS= read -r thefile; do
cd $DIR
mv -v "${thefile}" foobar"${add}".png
((add++))
done < <(find $DIR -name "*.png" | sort)
#-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请注意,这使用 process substitution ,它提供 while
循环:
Process substitution is a form of redirection where the input or output of a process (some sequence of commands) appear as a temporary file.
关于macos - 为什么我的 bash 会随机选择文件并重命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455576/