为什么我的 bash 随机选择文件并重命名?
Why is my bash randomly selecting files and renaming?
在我的 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 上搜索,但我没有看到任何解决控制增量问题的问题,我不知道它是否在特别是我应该看看。那么我如何控制从最低 number/filename 开始的增量,而不是 Mac 可能随机重命名的增量,以便获得所需的输出?
编辑:
在 Etan 的 之后,我查看了最后的数值,一些文件被命名为 foobarXXXX
,这就是问题所在。下面的答案虽然很棒,而且我将研究一种新方法,但由于其他一些文件,它仍然会产生相同的结果。如果我删除所有 foobarXXXX
的文件,只留下值为 foobarXXX
的文件,我的代码和 fedorqui 的答案工作中的代码。有没有一种方法可以在循环过程中定位这个,或者我是否必须定位所有名称并测试以查看值的长度并相应地进行调整?
您不能依赖 find
命令的顺序,它使用 the order that the VFS gives them to it in.
您可能想要 sort
它:
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.
在我的 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 上搜索,但我没有看到任何解决控制增量问题的问题,我不知道它是否在特别是我应该看看。那么我如何控制从最低 number/filename 开始的增量,而不是 Mac 可能随机重命名的增量,以便获得所需的输出?
编辑:
在 Etan 的 foobarXXXX
,这就是问题所在。下面的答案虽然很棒,而且我将研究一种新方法,但由于其他一些文件,它仍然会产生相同的结果。如果我删除所有 foobarXXXX
的文件,只留下值为 foobarXXX
的文件,我的代码和 fedorqui 的答案工作中的代码。有没有一种方法可以在循环过程中定位这个,或者我是否必须定位所有名称并测试以查看值的长度并相应地进行调整?
您不能依赖 find
命令的顺序,它使用 the order that the VFS gives them to it in.
您可能想要 sort
它:
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.