Есть ли способ использовать xargs через трубу?

15

Я пытаюсь автоматически конвертировать файлы flac, перемещенные в папку, в mp3 в другую папку.

Моя текущая строка кода такова:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

Чтобы объяснить, как это работает до сих пор, inotifywait рекурсивно отслеживает ~ / test для перемещаемых туда файлов, выводя путь и имя файла в канал. xargs берет это имя и создает правильную команду flac, заменяя x именем файла и декодируя файл в другой канал. В новой трубе lame обрабатывает вывод flac в mp3 в / media. Я хочу, чтобы xargs либо каким-то образом достигал канала, заменяя x в команде lame, либо каким-то образом отправлял ее переменной, к которой обе команды могут получить доступ, или что-то еще. Я попытался поиграться с именованными каналами и этим джазом, но тот факт, что между двумя командами передаются реальные данные, заставляет меня задуматься.

sagev9000
источник

Ответы:

16

Если я правильно понимаю, вы хотите запустить один экземпляр flac … | lame …для каждой строки ввода и интерполировать ввод в аргументы обеих команд.

Поскольку вам нужно xargsзапустить конвейер, вам нужно заставить его запустить программу, способную создавать конвейеры, то есть оболочку.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

В качестве альтернативы, вызовите оболочку, чтобы прочитать строки одну за другой и запустить конвейер.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

Обратите внимание, что формат %w%fсоздает абсолютный путь, к которому вы добавляете /media/1tbи добавляете символы .mp3. Если вы хотите удалить часть директории файла в lameкоманде, измените $fileна ${file##*/}. Если вы хотите удалить расширение, измените $fileна ${file%.*}. Если вы хотите сделать оба, вам придется сделать это в два этапа. Если вы хотите воспроизвести иерархию каталогов /media/1tb, вы можете использовать mkdir -p.

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done
Жиль "ТАК - прекрати быть злым"
источник
3

Вы можете попробовать что-то вроде:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;
лютик золотистый
источник
1
while read …это решение, но затем, капля xargs. То, что вы написали, просто не имеет смысла: как вы думаете, откуда берется xargsего вклад? И вы должны правильно цитировать вещи, обычно имена музыкальных файлов содержат пробелы.
Жиль "ТАК - перестань быть злым"
@ Жиль: Мне не было / не ясно, что именно делает ОП, поэтому я сказал: «Вы можете попробовать что-то вроде » и «Я не уверен, что бит xargs соответствует вашим намерениям» и т. Д. Так что, думаю, не лучший ответ, а намек в правильном направлении. Устранена проблема с цитированием и удален xargs.
Златовласка