Existe alguma maneira de usar xargs em um pipe?

14

Estou tentando converter automaticamente arquivos flac movidos para uma pasta em mp3 em outra pasta.

Minha linha de código atual é esta:

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

Para explicar como isso funciona até agora, inotifywait monitores ~ / teste recursivamente para arquivos movidos para lá, a saída do caminho e nome do arquivo para um pipe. xargs pega esse nome e cria o comando flac adequado, substituindo x pelo nome do arquivo e decodificando o arquivo para outro canal. No novo pipe, o lame processa a saída do flac em mp3 em / media. Eu quero que os xargs alcancem o pipe de alguma maneira, substituindo o x no comando lame ou de alguma forma o envie para uma variável que ambos os comandos possam acessar ou algo assim. Eu tentei mexer com pipes nomeados e esse jazz, mas o fato de que há dados reais sendo canalizados entre os dois comandos me faz passar por cima da minha cabeça.

    
por sagev9000 21.12.2013 / 18:29

2 respostas

17

Se bem entendi, você quer abrir uma instância flac … | lame … para cada linha de entrada e interpolar a entrada nos argumentos para ambos os comandos.

Como você precisa de xargs para iniciar um pipeline, é necessário iniciar um programa capaz de criar pipelines, ou seja, um shell.

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

Como alternativa, peça ao shell de chamada que leia as linhas uma a uma e execute o pipeline.

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

Tenha em atenção que o formato %w%f produz um caminho absoluto, ao qual preestende /media/1tb e acrescentar .mp3 . Se você quiser remover a parte do diretório do arquivo no comando lame , altere $file para ${file##*/} . Se você quiser remover a extensão, altere $file para ${file%.*} . Se você quiser fazer as duas coisas, terá que fazer isso em duas etapas. Se você quiser reproduzir a hierarquia de diretórios em /media/1tb , use 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
    
por 23.12.2013 / 02:32
3

Você poderia tentar algo como:

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;
    
por 21.12.2013 / 18:47