重命名所有子目录中具有特定扩展名的所有文件

重命名所有子目录中具有特定扩展名的所有文件

我有很多目录。其中每一个都有一个具有特定扩展名的文件.ext

我想重命名这些文件。

例子:

// Note: The names are random, can have spaces and special characters

Parent
 |
 |- First Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
 |
 |- Second Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
[…]

我想将所有扩展.ext名为new name.ext2.每个目录只有一个文件.ext,所以没有问题。

到目前为止我所做的是:

find ./Parent -name "*.ext" -exec mv "{}" "{}.ext2" \;

我得到了一堆The one to rename.ext.ext2,我陷入了重命名它们的困境new name.ext2。如果我只是将其设置为 的第二个参数mv,它将把它们移动到Parent目录中,因此,每次调用该mv函数都会覆盖以前移动的文件。

注意:我无法使用参数使其工作-exec bash -c ''。我尝试了以下内容:

find ./Parent -name "*.ext" -exec bash -c 'mv {} "$(dirname {})/new name.ext2"' \;

$()但我之前遇到了一些扩展问题{}

答案1

您可以使用-printf函数find来构造您的命令:

find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext"
mv /tmp/foo.ext /tmp/new_name.ext

当您用 包围命令时$(),将执行命令:

$(find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext")
find /tmp -name "*.ext"
/tmp/new_name.ext

更新:

上述命令无法正确处理多个文件,并且未使用引号值。请改用以下命令:

find /tmp -name \*.ext\*
/tmp/dir with space/bar.ext
/tmp/foo.ext

bash -x < <(find /tmp -name "*.ext" -printf "mv \"%p\" \"%h/new_name.ext2\"\n")
+ mv '/tmp/dir with space/bar.ext' '/tmp/dir with space/new_name.ext2'
+ mv /tmp/foo.ext /tmp/new_name.ext2

find /tmp -name \*.ext\*
/tmp/dir with space/new_name.ext2
/tmp/new_name.ext2

答案2

使用sed

for file in */*.ext; do
    ext2=`echo $file | sed 's/.ext/.ext2/'`
    mv $file $ext2
done

相关内容