递归重命名所有子目录中的.jpg文件

时间:2014-03-13 12:16:10

标签: linux perl bash recursion

我在Linux系统上,我正在尝试将许多子目录中的所有.jpg文件重命名为顺序文件名,因此每个子目录中的所有jpeg文件都重命名为0001.jpg,0002.jpg等。我有一个'重命名'命令在单个目录中工作:

rename -n 's/.*/sprintf("%04d",$::iter++ +1).".jpg"/e' *.jpg

我试图像这样使用它:

for i in ls -D; do rename -n 's/.*/sprintf("%04d",$::iter++ +1).".jpg"/e' *.jpg; done

但是对于输出我得到了这个:

*.jpg renamed as 0001.jpg
每个子目录的

。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要按顺序将命令放入反引号中(或使用$( ... ) bash语法) 迭代它的输出。还可以将$i变量与* .jpg文件一起使用 名称模式,例如

for i in `ls -D`
do
    rename -n 's/.*/sprintf("%04d",$::iter++ +1).".jpg"/e' $i/*.jpg
done

但是,对于这种情况,您希望迭代所有子目录,而您是 更好地使用find命令:

for i in `find . -type d`; do rename ...

答案 1 :(得分:0)

在我看来,您忘记更改当前工作目录,因此它应该看起来像

for i in *; do
  [ -d "$i" ] || continue
  pushd "$i"
    # rename is here 
  popd
done