我想在每个文件名后附加一个“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 中的文件没有目录组件。