通过脚本重命名文件

时间:2016-05-11 14:10:01

标签: bash shell scripting

我有一些错误命名的文件(扩展名添加了两次到最后)。我试图编写一个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

2 个答案:

答案 0 :(得分:4)

你的变量扩展中有一个拼写错误:

"{$file%.avi.mp4}.mp4"

应该是:

"${file%.avi.mp4}.mp4"

但是,您可能需要查看renameperl-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

这里发生了什么:

  1. 我们find了所有以.avi.mp4扩展名结尾的文件。
  2. 由于文件可以包含换行符,因此我们使用print0的{​​{1}}选项使文件名为null。
  3. 此输出通过管道输入到我们准备解析文件的while循环中。
  4. find的分隔符-d选项设置为null(read)命令,我们解析每个空终止的文件名。
  5. 最后,我们使用参数扩展/替换来删除每个文件末尾的'',并在.avi.mp4阶段向每个文件追加.mp4。见参考文献1.
  6. 参考文献:

    1. Shell parameter expansion
    2. Move manual
    3. Why use while instead of for?