在命令行中对每个子目录执行命令

在命令行中对每个子目录执行命令

我想在每个文件名后附加一个“0”,并以单个整数作为文件名,即。

1.jpg --> 01.jpg

我使用了以下命令,但没有任何反应。
您能告诉我问题出在哪里或者还能做什么吗?:

find . -maxdepth 1 -type d \( ! -name . \) -exec fish -c "cd '{}' ; 
for f in *;
  if [ (string length '$f') -eq '5' ];
    mv '$f' '0$f';
  end;
end; " \;

相同的命令似乎在命令行中不起作用,但在通过脚本调用时不起作用。当我尝试从脚本调用 seq(没有明确提及范围)时,也是同样的情况......显示“缺少操作数”。

答案1

看看这是否适合你:

find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"

这将查找当前目录中所有由单个数字组成并以 3 个字符扩展名结尾的文件。如果您想要目录而不是文件(如您的示例所示),请将其替换-type f-type d。如果您需要允许更长的扩展名,您可以调整搜索模式。如果您需要递归搜索,请删除该-maxdepth 1参数。此命令的输出将是执行重命名时要运行的命令。例如:

$ ls
10.png  1.png  2.png  3.png

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"
mv "./3.png" "./03.png"
mv "./2.png" "./02.png"
mv "./1.png" "./01.png"

如果输出看起来正确,您可以通过将 find 命令的输出传送到 shell 来运行它:

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n" | fish

$ ls
01.png  02.png  03.png  10.png

答案2

不涉及find命令的鱼类解决方案如下所示:

#!/usr/bin/env fish
for f in *.jpg
    if string match -qr '^\d\.' -- $f
        mv $f 0$f
    end
end
for f in **/*.jpg
    set p (string split --right --max=1 / -- $f)
    if string match -qr '^\d\.' -- $p[2]
        mv $f $p[1]/0$p[2]
    end
end

您可以使用单个 for 循环来执行此操作,该循环获取当前目录及其所有子目录中的 jpg 文件:

for ***.jpg
    do stuff
end

但是,这会使 for 块内的逻辑变得复杂,因为 cwd 中的文件没有目录组件。

相关内容