Как использовать "комнату! (*keyword) в ударе 4.1.2?

Если я понимаю правильно, Вы хотите разжечь один экземпляр 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
2
12.08.2014, 02:23
1 ответ

Так что я просто дам ответ на вопрос. Вам нужно включить extglob, чтобы заставить bash распознавать расширенные паттерны помимо синтаксиса расширения истории.

shopt -s extglob
rm !(*keyword)

shopt -s extglob также включает расширенное совпадение паттернов на case и [[ ]], но это уже поведение по умолчанию в [[ ]], начиная с Bash 4.1, а расширенные паттерны уже распознаются с включенной опцией или без нее.

Для справки смотрите раздел Руководства по бэшу.

4
27.01.2020, 22:00

Теги

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