Выполнение команды внутри папок и подпапок с помощью скрипта оболочки - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я пытаюсь использовать одну командную строку для переименования всех .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 голосов
/ 07 декабря 2018

Нет веской причины использовать команду 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 в виде строки в своей командной строке.Это не оценивается как глоб (и заменяется списком подходящих файлов), потому что расширение глоба выполняется оболочкой , и между процессами find и rename нет оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...