Переименование имени выходного файла из ffmpeg при использовании find и xargs

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

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

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

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

abc.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 выдаст ошибку.

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

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


person Ayyappadas V    schedule 17.03.2020    source источник
comment
лучше сделать небольшой скрипт, который выполняет всю обработку входных и выходных имен, а затем вызывает ffmpeg с исправленными аргументами. Удачи.   -  person shellter    schedule 18.03.2020


Ответы (1)


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

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 в качестве подпроцесса. Если у вас нет конкретной причины использовать find и xargs, проще будет сказать:

for org in *.mp4 *.mov; do
    new="$PWD/${org%.*}_h264.mov"
    ffmpeg -i "$org" {options} "$new"
done
person tshiono    schedule 18.03.2020
comment
Мой мужчина! Это решает проблему. Большое спасибо за расширение моего понимания xargs. Я согласен, что использование цикла for - гораздо более простой способ сделать это. Я просто хотел обработать несколько файлов, как пакетный процесс, потому что у меня есть для этого доступная мощность, а не просматривать его по одному файлу за раз. Большое спасибо за помощь. - person Ayyappadas V; 18.03.2020