Мне нужно конвертировать видео, но я не знаю, где они, поэтому они мне нужны find
. Как я могу дать результат и имя выходного файла для FFmpeg с xargs
?
Я уже выяснил, что с помощью этой команды я могу построить два параметра:
find . -iname "*.mov" -printf "%p %f\n"
Я не могу найти ничего связанного в xargs
руководстве. Я хочу что-то вроде этого:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
Как я могу это сделать?
command-line
bash
xargs
command-line-arguments
kissgyorgy
источник
источник
xargs
вообще возможно , захотите проверить stackoverflow.com/questions/3770432/... .Ответы:
Нечто подобное будет делать трюк и сохранить полный путь, ручки пространство, переименование
folder/movie.mov
доfolder/movie.flv
и т.д.И если я вас неправильно понял, и вы хотите все фильмы .flv в текущем каталоге, используйте вместо этого:
источник
Причина, по которой люди используют
xargs
в сочетании с find, заключается в том, что несколько имен файлов будут переданы в один и тот же вызов программы независимо от того, какая программаxargs
запускается. Например, еслиfind
возвращает файлы foo , bar и baz , следующее будет выполненоmv
только один раз:По сути, это вызывает
mv
следующее:Если вам не нужно или не нужно такое поведение (как я полагаю, здесь имеет место), вы можете просто использовать
find
s-exec
.В этом случае простым решением было бы написать короткий сценарий оболочки, например:
Сохранить как
myffmpeg.sh
и запуститьchmod +x myffmpeg.sh
. Затем выполните следующее:Это вызовет скрипт оболочки один раз для каждого найденного файла. Сценарий оболочки, в свою очередь, извлекает имя файла из полного пути и вызывает
ffmpeg
с соответствующими аргументами.источник
Я не получил решение, которое ожидалось, поэтому я нашел свое собственное. @ Даниэль ответит хорошо, но для этого нужен сценарий оболочки. Один лайнер быстрее, и мне нравится больше :), также более простое решение, чем написание скрипта.
Я мог бы использовать один аргумент и обработать его с
basename
помощью иsh -c
-I говорит xargs заменить
{}
текущим аргументом.Вывод команды внутри `` распечатывается на стандартный вывод (функция bash), поэтому
basename {}
будет оцениваться как пустое имя файла и распечатываться.-0 для правильной обработки специальных имен файлов, но вам нужно передать параметры с опцией -print0 с помощью find
источник
Вы должны сделать это, как и все ответы, но ТОЧНОЕ использование xargs будет примерно таким:
Так что в вашем случае это будет:
PS: Это ответ на вопрос о xargs для тех, кто ищет ответ именно для нескольких
xargs
параметров в однойxargs
команде.источник
Почему бы просто не переместить параметры ffmpeg, чтобы они соответствовали формату результатов команды find ?
Обратите внимание на добавление опции -r к xargs, чтобы предотвратить запуск ffmpeg, если нет найдены файлы .mov .
Я добавил опцию -n2 в xargs, чтобы ограничить количество элементов, которые xargs обрабатывает до двух одновременно. В этом случае элементами являются путь к файлу и имя файла. Если не задана опция -n , xargs обработает как можно больше входных элементов за одно выполнение.
источник
Я не уверен, можете ли вы или как это сделать с помощью xargs.
Но что-то вроде этого должно работать для вас:
источник
Альтернатива ответу Zoredache с использованием привязки имени (и с использованием различных разделителей, чтобы избежать проблемы пробелов в именах файлов):
Конечно, вы также можете использовать разделители с
find -a array
аргументом, использованным в другом ответе, но иногда именованные аргументы более понятны.источник
Вы можете запустить ffmpeg непосредственно из команды find следующим образом:
Обратите внимание на кавычки вокруг параметров ffmpeg, если в имени файла есть пробелы, а экранированная точка с запятой отмечает конец выполненной команды.
источник