Czy jest jakiś sposób na użycie xargs na rurze?

15

Próbuję automatycznie przekonwertować pliki flac przeniesione do folderu na mp3 w innym folderze.

Mój obecny wiersz kodu to:

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

Aby wyjaśnić, jak to działa do tej pory, inotifywait monitoruje ~ / test rekurencyjnie dla plików tam przeniesionych, wysyłając ścieżkę i nazwę pliku do potoku. xargs przyjmuje tę nazwę i tworzy właściwe polecenie flac, zastępując x nazwą pliku i dekodując plik na inny potok. W nowym potoku lame przetwarza dane wyjściowe flaca na mp3 under / media. Chcę, aby xargs w jakiś sposób sięgał w poprzek potoku, zastępując x w poleceniu lame lub w jakiś sposób wysyłał go do zmiennej, do której oba polecenia mają dostęp lub coś. Próbowałem bawić się nazwanymi potokami i tym jazzem, ale fakt, że między tymi dwoma poleceniami przesyłane są rzeczywiste dane, prowadzi mnie ponad głowę.

sagev9000
źródło

Odpowiedzi:

16

Jeśli dobrze rozumiem, chcesz uruchomić jedną instancję flac … | lame …dla każdej linii wejściowej i interpolować dane wejściowe w argumentach obu komend.

Ponieważ musisz xargsuruchomić potok, musisz uruchomić program zdolny do tworzenia potoków, tj. Powłokę.

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"'

Ewentualnie poproś, aby wywołująca powłoka czytała wiersze jeden po drugim i uruchamiała potok.

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

Pamiętaj, że format %w%ftworzy ścieżkę bezwzględną, do której przygotowujesz /media/1tbi dołączasz .mp3. Jeśli chcesz usunąć część katalogu z pliku w lamepoleceniu, zmień $filena ${file##*/}. Jeśli chcesz usunąć rozszerzenie, zmień $filena ${file%.*}. Jeśli chcesz zrobić jedno i drugie, musisz to zrobić w dwóch krokach. Jeśli chcesz odtworzyć hierarchię katalogów /media/1tb, możesz użyć 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
Gilles „SO- przestań być zły”
źródło
3

Możesz spróbować czegoś takiego:

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;
Złotowłosa
źródło
1
while read …jest rozwiązaniem, ale potem upuść xargs. To, co napisałeś, nie ma sensu: jak myślisz, skąd xargsbierze się Twój wkład? I powinieneś cytować wszystko poprawnie, często nazwy plików muzycznych zawierają spacje.
Gilles „SO - przestań być zły”,
@Gilles Nie było / nie jest dla mnie jasne, co dokładnie robi OP, dlatego powiedziałem „możesz spróbować czegoś takiego ” i „Nie jestem pewien, czy bit xargs jest zgodny z twoimi intencjami” itp. Myślę, że nie najlepsza odpowiedź, ale wskazówka we właściwym kierunku. Naprawiono problem z cytowaniem i usunąłem xargs.
goldilocks,