使用Shell脚本在文件夹和子文件夹中执行命令

时间:2018-12-06 23:22:06

标签: shell find

当前,我正在尝试使用一个命令行将所有 .mp4.mp4 重命名为 .mp4

我有很多.mp4文件,它们的名称如下:

103160626309temp1ep10.mp4
103160626309temp1ep10.mp4.mp4

148999555452temp1ep6.mp4
148999555452temp1ep6.mp4.mp4

6802547045temp1ep5.mp4
6802547045temp1ep5.mp4.mp4

335587012366temp1ep4.mp4
335587012366temp1ep4.mp4.mp4
...

我正在尝试使用find . -iname "*.mp4.mp4" -exec rename -f 's/\.mp4\.mp4\z/.mp4/' *.mp4.mp4 \;将所有文件夹和子文件夹中的所有.mp4.mp4重命名为.mp4,但出现此错误:

Can't rename *.mp4.mp4 *.mp4: No such file or directory
Can't rename *.mp4.mp4 *.mp4: No such file or directory
Can't rename *.mp4.mp4 *.mp4: No such file or directory
Can't rename *.mp4.mp4 *.mp4: No such file or directory
...

您知道如何解决此问题吗?谢谢。

1 个答案:

答案 0 :(得分:2)

根本没有充分的理由使用rename命令;只需直接重命名您的匹配项即可。

find . -name '*.mp4.mp4' -execdir sh -c 'for f; do mv -- "$f" "${f%.mp4}"; done' _ {} +

...甚至是...

while IFS= read -r filename; do
  mv -- "$filename" "${filename%.mp4}"
done < <(find . -name '*.mp4.mp4' -print0)

也就是说,要解释为什么,您会遇到错误:假设运行命令的目录中没有*.mp4.mp4文件,

find . -iname "*.mp4.mp4" -exec rename -f 's/\.mp4\.mp4\z/.mp4/' *.mp4.mp4 \;

成为...

find . -iname "*.mp4.mp4" -exec rename -f 's/\.mp4\.mp4\z/.mp4/' '*.mp4.mp4' \;

...因此,以rename开头的每个find命令在其命令行上都包含*.mp4.mp4 作为文字字符串。不会将其评估为glob(并替换为匹配文件列表),因为glob扩展是由shell 执行的,并且find和{{1}之间没有shell }流程。