Файл /etc/resolv.conf
читается *вызовами libc, выполняющими разрешение имени хоста. В первую очередь это getaddrinfo
и устаревшее gethostbyname
.
Если этим функциям передается DNS-имя, то они делают это в следующем порядке::
/etc/hosts
. /etc/resolv.conf
. Поскольку вы упомянули dnsmasq:Это DNS-сервер, работающий локально. Таким образом, во многих современных дистрибутивах Linux /etc/resolv.conf
указывает только на 127.0.0.1
(, где локальный dnsmasq прослушивает ). Затем dnsmasq настраивается для пересылки запросов на DNS-серверы Интернета; dnsmasq настраивается Network Manager при подключении к Интернету.
Спасибо за ответ 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 {} \;
Я не являюсь пользователем 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...
грамматике.