Чи є спосіб використовувати 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 монітори ~ / тестують рекурсивно для файлів, переміщених туди, виводячи шлях та ім'я файлу до труби. xargs приймає це ім'я та створює належну команду flac, замінюючи x на ім'я файлу та декодуючи файл на іншу трубку. У новій трубі кульга обробляє вихід flac в mp3 під / медіа. Я хочу, щоб xargs якимось чином дісталися через трубу, замінюючи x в команді кульгавий або якимось чином надсилав її до змінної, обидві команди можуть отримати доступ чи щось. Я спробував возитися з названими трубами та цим джазом, але той факт, що між цими двома командами є фактичні дані, перебуває у мене над головою.

Відповіді:


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його внесок? І вам слід правильно цитувати речі. Імена музичних файлів зазвичай містять пробіли.
Жил "ТАК - перестань бути злим"

@Gilles Мені не було / не ясно, що саме робить ОП, саме тому я сказав "ти можеш спробувати щось на кшталт " і "Я не впевнений, чи біт xargs відповідає вашим намірам" тощо Тому я не найкраща відповідь, але підказка в правильному напрямку. Виправили проблему котирування та видалили xargs.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.