Переименование имени выходного файла из ffmpeg при использовании find и xargs - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь переименовать выходные файлы, которые выходят из процессов ffmpeg, которые я создал, используя find и xargs. У меня есть каталог файлов, который я хотел бы преобразовать в определенный формат, и в конечном итоге все эти файлы должны иметь имя .mov. Поэтому я отфильтровываю файлы .mp4 & .mov, а затем использую xargs для передачи его в ffmpeg.

Предположим, есть такие файлы, как ab c .mp4, abcd.mp4, abcde.mp3, bcd. .mov et c в текущем рабочем каталоге, а затем я делаю что-то вроде этого, чтобы отфильтровать только файлы mp4 и mov и передать их в ffmpeg для кодирования:

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 -p 5 -I '{}' ffmpeg -i '{}' ....... $PWD/{}"_h264.mov"

Это будет делать то, что я хочу, чтобы ffmpeg делал, но называет файлы как

ab c .mp4_h264.mov, abcd.mp4_h264.mov, bcd.mov_h264.mov

В идеале я хотел бы добиться, чтобы выходные файлы назывались

abc_h264.mov, abcd_h264.mov, bcd_h264.mov

В моем мозгу не возникает искорка о том, как это сделать. в том месте, где я указываю выходные файлы ffmpeg. Я знаю, что могу вызвать команду basename, используя xargs, как это

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 basename | rev | cut -d . -f 2 | rev

, и извлечь имя файла без расширения, но если я использую это, то как я могу передать его в ffmpeg как входной файл, потому что он потерял бы расширение, когда выйдет из xargs, а ffmpeg выдаст ошибку.

Может ли кто-нибудь помочь мне достичь этого за один go, где я могу указать, что делает «basename», но где я указываю имя выходного файла ffmpeg, пожалуйста?

Большое спасибо за любую помощь, которую вы можете предоставить. Очень ценю сообщество.

1 Ответ

1 голос
/ 18 марта 2020

Не могли бы вы попробовать следующее:

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -I {} -n 1 -P 5 bash -c 'org="{}"; new="$PWD/${org%.*}_h264.mov"; ffmpeg -i "$org" {options} "$new"'

Но это неэффективно для запуска команды bash в качестве подпроцесса несколько раз. Если у вас нет конкретной причины c для использования find и xargs, проще будет сказать:

for org in *.mp4 *.mov; do
    new="$PWD/${org%.*}_h264.mov"
    ffmpeg -i "$org" {options} "$new"
done
...