Запустите команду во всех папках и подпапках с определенным расширением - PullRequest
1 голос
/ 29 июня 2019

В настоящее время я пытаюсь запустить команду на моем сервере Linux (Ubuntu 16.04), чтобы перекодировать все файлы .mp4. Но у меня есть много файлов внутри папок и подпапок, и я собираюсь тратить много времени на запуск этих команд вручную

Вот мой сценарий:

for D in ./*; do
    if [ -d "$D" ]; then
        cd "$D"
        for i in *.mp4; do
            ffmpeg -i "$i" -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng "${i%.*}.mp4"
        done
        cd ..
    fi
done

Но я получаю эту ошибку:

Error: ENOENT: no such file or directory, stat '*.mp4'

Как я могу решить это?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 июня 2019

Используйте find для этого.Он обрабатывает рекурсию подкаталога для вас.Например:

find . -type f -name "*.mp4" -exec ffmpeg -i {} -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng {}  \; -print
  • find автоматически обработает текущий каталог и все его подкаталоги
  • -type f: для поиска только файлов
  • `-name "* .mp4": только файлы с расширением mp4
  • -exec COMMAND {} \;: выполнить эту команду для всех найденных файлов.{} будет заменено именем файла каждого файла.\; для завершения команды.
  • -print: напечатает, какой файл был обработан

Что касается вашего кода, существует вероятность, что каталогне будет файлов "* .mp4", поэтому ошибка no such file or directory, stat '*.mp4' при попадании в такой каталог.

0 голосов
/ 30 июня 2019

Пример (без эффекта, только сделать echo ...):

$ find \
  . \
  -type f \
  -name '*.mp4' \
  -exec sh -c '
    for src in "$@"; do
      dst="${src%.*}.mkv"
      echo ffmpeg ... "$src" ... "$dst"
    done
  ' sh {} + \
  -print \
;

Вы должны заменить echo ffmpeg ... "$src" ... "$dst" командной строкой для производственного использования. Вы можете удалить -print из примера.

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