我有很多目录。其中每一个都有一个具有特定扩展名的文件.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