Скажите pdflatex не ожидать любого интерактивного входа когда-либо:
pdflatex -interaction nonstopmode "$1"
Если команда возвращает ненулевое состояние ($?
), была ошибка, таким образом, метка 0. Иначе протестируйте ли файл журнала (как $1
, но с .log
вместо расширения это уже там), содержит слово Warning
; если это делает, метка равняется 1, иначе метка 0.
Вот быстрая острота, которую можно ввести в терминале:
find . -name "*.wav" -print0 | while read -d $'\0' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done
Можно также использовать ffmpeg, как @slm предполагает,
find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done
Я не уверен, как neroAacEnc выдерживает сравнение с ffmpeg, но я знаю, что ffmpeg совершенствуется довольно популярный у многих пользователей Linux.
Объяснение
find
программа, которая возвращает пути к файлам, которые соответствуют определенному свойству файла, в этом случае имя файла. Если бы все, что Вы хотели знать, было тем, какие .wav файлы находятся в подкаталогах Вашего текущего пути, то Вы сделали бы find . -name "*.wav"
. Обычно это производит каждый файл на новой строке. -print0
заставляет его разделить соответствия с нулевым символом вместо этого. Это допускает правильное обращение имен файлов с пробелами, когда мы передаем вывод следующим командам.
|
символ известен как канал. Это говорит оболочке брать вывод команды слева и передавать его как вход к команде справа, в этом случае, read
команда в while
цикл.
read
команда используется для взятия вывода find
и присвойте его переменной, "файлу". Обычно это присвоило бы значения, чтобы "зарегистрировать" каждое слово за один раз, но -d $'\0'$
заставляет присвоения быть разграниченными нулевым символом (соответствие, как мы разграничили файлы в find
при помощи -print0
флаг).
Причины циклов с условием продолжения read
многократно присваивать значения "файлу" для каждого имени файла соответствия. do
и done
часть стандартного синтаксиса удара некоторое время цикл:
while <something is true>; do
<run some commands>
done
В этом случае, наш "выполненный некоторая команда" также ffmpeg
или neroAacEnc
. В каждом из случаев, входной файл (т.е. $file
) указан с переменной "файла", с которой мы присвоились read
, и выходной файл (т.е. ${file%wav}w4a
) управление этой переменной, которая позволяет нам указывать другое имя для вывода. Обычно $file
или ${file}
оценил бы к названию файла, сказал бы некоторый song.wav. %
говорит для отключения от права на переменную любой последовательности, соответствующей символам [1] направо от %
(т.е. "wav"). Так ${file%wav}
оценил бы к некоторой песне., и затем "m4a" там, чтобы быть новым концом имени файла: некоторая песня m4a.
[1] Я говорю "символы" здесь для простоты. Последовательность направо от %
могло быть регулярное выражение. Например, если мы сказали ${file%w*v}
и переменная была некоторой песней w1234v, она также оценит к некоторой песне..
Не уверенный в переключателях командной строки к neroAacEnc, но чему-то вроде этого:
% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
neroAacEnc $orgfile $newfile
' {} \;
Или Вы могли использовать ffmpeg, чтобы сделать (непротестированное) преобразование:
% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
ffmpeg -i $orgfile -ab 256 $newfile
' {} \;
#!/bin/bash
# myscript.bash
cd <dir where .wav files are>
find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
neroAacEnc -2pass -q 1 -if $orgfile -of $newfile
' {} \;
После создания файла (myscript.bash) делают это исполняемым файлом chmod +x myscript.bash
, выполните его ./myscript.bash
, и Вы сделаны.
-FFmpeg и AAC, кодирующий руководство
Примечание: Существуют дополнительные "рецепты" для преобразования .wav к .aac и получению различных качеств, характеристик, и т.д.
bash -x myscript.bash > debug.log 2>&1
и отправьте содержание debug.log на pastebin.com.
– slm♦
22.04.2013, 00:26
Я также использовал бы ffmpeg. При использовании libfaac он только поддерживает - AQ и не-vbr или-ab:
for f in **/*.wav; do ffmpeg -i "$f" -c:a libfaac -aq 150 "${f%wav}m4a"; done
**
требует удара 4.0 или выше и shopt -s globstar
или zsh. Можно показать информацию о файлах результата с ffmpeg -i
.
Согласно http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide, собственный кодер (который использовался, если я не указывал-c:a) является более низким качеством, чем libfaac, который является более низким качеством, чем libfdk_aac. --enable-libfdk_aac --enable-nonfree
(или brew install ffmpeg --with-fdk-aac
) включает поддержку libfdk_aac.
Если у Вас есть 4 центральных процессора, это доходит до 4 процессов параллельно:
find . -name \*.wav | parallel ffmpeg -i {} -c:a libfdk_aac -vbr 4.5 {.}.m4a
- vbr 0 является самым низким,-vbr 5 является самым высоким.