我有一些错误命名的文件(扩展名添加了两次到最后)。我试图编写一个bash脚本来扫描目录并重命名它们,但它会抛出错误:
无法将'/var/random/file/file1.avi.mp4'移动到'{/var/random/file/file1.avi.mp4%.avi.mp4}.mp4':没有这样的文件或目录< / p>
我只是想正确地重命名文件扩展名,并且不确定错误发生在哪里。例如,上面的错误应该具有.mp4的文件扩展名。以下是我的剧本,如果有人可以提供帮助,我会被曝光......
#/bin/sh
for file in $(find /var/random/ -type f -name "*.avi.mp4"); do
mv "$file" "{$file%.avi.mp4}.mp4"
done
答案 0 :(得分:4)
你的变量扩展中有一个拼写错误:
"{$file%.avi.mp4}.mp4"
应该是:
"${file%.avi.mp4}.mp4"
但是,您可能需要查看rename
(perl-rename
)
perl-rename 's/[^.]+\.(?=[^.]+$)//' /var/random/*/*.avi.mp4
正则表达式将删除文件名中倒数第二个扩展名:
/path/to/file/foo.bar.baz -> /path/to/file/foo.baz
答案 1 :(得分:2)
find . -type f -name "*.avi.mp4" -print0 | while read -rd '' filename
do
if [ -e "${filename%.avi.mp4}.mp4" ]
then
mv --backup "${filename}" "${filename%.avi.mp4}.mp4"
#doing the backup only if the destination file exists to save space.
else
mv "${filename}" "${filename%.avi.mp4}.mp4"
fi
done
这里发生了什么:
find
了所有以.avi.mp4
扩展名结尾的文件。print0
的{{1}}选项使文件名为null。 find
的分隔符-d
选项设置为null(read
)命令,我们解析每个空终止的文件名。''
,并在.avi.mp4
阶段向每个文件追加.mp4
。见参考文献1. 参考文献: