Если я понимаю правильно, Вы хотите разжечь один экземпляр 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
Так что я просто дам ответ на вопрос. Вам нужно включить extglob
, чтобы заставить bash распознавать расширенные паттерны помимо синтаксиса расширения истории.
shopt -s extglob
rm !(*keyword)
shopt -s extglob
также включает расширенное совпадение паттернов на case
и [[ ]]
, но это уже поведение по умолчанию в [[ ]]
, начиная с Bash 4.1, а расширенные паттерны уже распознаются с включенной опцией или без нее.