为什么我的bash随机选择文件并重命名?

时间:2015-07-16 13:27:51

标签: macos bash increment

在我的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可能随机重命名,以便我得到所需的输出?

编辑:

在Etan的comment之后,我在最后查看数值,有些文件名为foobarXXXX,这就是问题所在。下面的答案虽然很棒,但我会研究一种新的方法,因为其他一些文件仍会产生相同的结果。如果我删除foobarXXXX的所有文件,并且仅保留值foobarXXX我的代码的文件,并且fedorqui的答案中的代码可以正常工作。有没有办法可以在循环过程中对此进行定位,还是我必须定位所有名称并测试以查看值的长度并进行相应调整?

1 个答案:

答案 0 :(得分:3)

您不能依赖使用the order that the VFS gives them to it infind命令的顺序。

相反,您可能希望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循环:

  

进程替换是一种重定向形式,其中输入或   进程的输出(某些命令序列)显示为临时的   文件。