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

标签 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 可能随机地以增量重命名,以便获得所需的输出?


编辑:

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/

相关文章:

c - 使用 execl 获取 grep 值

javascript - NodeJS - 如何将所有 console.log 写入文件?

javascript - 添加数字而不是添加增量

python - =+ Python 运算符在语法上是正确的

macos - AppleScript 将文本从剪贴板粘贴到文件中

macos - 在 Mac 上构建 GLSDK - 找不到 platform.h

java - 将 Java6 与应用程序一起移植

Node.JS [nodemon] 内部监视失败 : ENFILE: file table overflow

linux - 从 shell 脚本中递归地进行 CVS 标记

mysql - 为sql中的每个唯一值插入增量