ffmpeg для файлов .avi в подкаталогах

Файл /etc/resolv.confчитается *вызовами libc, выполняющими разрешение имени хоста. В первую очередь это getaddrinfoи устаревшее gethostbyname.

Если этим функциям передается DNS-имя, то они делают это в следующем порядке::

  1. Попробуйте разрешить имя хоста локально, то есть прочитав /etc/hosts.
  2. Если это не удается, запросите DNS-серверы, перечисленные в /etc/resolv.conf.
  3. Если это также не удается, то имя хоста не может быть разрешено.

Поскольку вы упомянули dnsmasq:Это DNS-сервер, работающий локально. Таким образом, во многих современных дистрибутивах Linux /etc/resolv.confуказывает только на 127.0.0.1(, где локальный dnsmasq прослушивает ). Затем dnsmasq настраивается для пересылки запросов на DNS-серверы Интернета; dnsmasq настраивается Network Manager при подключении к Интернету.

1
07.05.2020, 13:27
2 ответа

Спасибо за ответ Cbhihe , так как он привел меня на правильный путь. Мне нужно было кое-что изменить из-за того, как базовый уровень работает на Mac, и из-за обработки пробелов в именах файлов.

macOS findиспользует особый синтаксис. Вы можете использовать следующий вкладыш -:

find -E. -type f -iregex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;

  • find -E. -type f -iregex ".*\.avi"поиск файлов :
    • .указывает на поиск в текущем каталоге,
    • -Eуказывает на расширенный поиск, который позволяет использовать регулярные выражения,
    • -iregex ".*\.avi"ищет все `файлы.aviz по этому пути, включая подкаталоги.
  • -execdir bash -c '<COMMAND>' shellproc {} \;выполняет КОМАНДУ с использованием оболочки bash для каждого результата поиска, выполняемого из того же каталога, что и результат поиска. Имя файла передается как аргумент $1.
  • in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"определяет имена входных и выходных файлов, запускает ffmpeg для повторного мультиплексирования и подавляет подробный вывод ffmpeg, а также удаляет входной файл только после успешного завершения повторного мультиплексирования.

В системах Linux синтаксис findнемного отличается:

find. -type f -regex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;

0
28.04.2021, 23:16

Я не являюсь пользователем ffmpegи пишу этот ответ из среды bashна Arch Linux, но ваши два требования могут быть выполнены, например, на FreeBSD и MacOS -X с:

$ from=avi; to=mp4; 
$ find -E. -type f -iregex ".*\.avi" -execdir \
  sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3' shellproc "$from" "$to" {} \;

В одной строке выше:

  • Я включил -type fперед -iregex.... Это должно сэкономить ваше время, statвыполняя только файлы типа "обычный файл".
  • $1означает$from
  • $2означает$to
  • $3означает {}, т.е. результат вашей findкоманды
  • shellprocв ...shellproc "$from" "$to" {} \;— это просто произвольный тег, который идентифицирует процессы оболочки, выполняемые с помощью :sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3'. Этот тег будет префиксом любого сообщения об ошибке, выводимого указанной оболочкой. Это его функция.

Есть несколько возможных способов сделать то, что вы хотите. Я бы порекомендовал вам взглянуть на ответ Кусалананды, чтобы узнать (намного )больше о find... -exec...грамматике.

0
28.04.2021, 23:16

Теги

Похожие вопросы