Existe alguma maneira de usar xargs através de um cano?

15

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, o inotifywait monitora ~ / test recursivamente os arquivos movidos para lá, produzindo o caminho e o nome do arquivo em um canal. xargs leva esse nome e cria o comando flac adequado, substituindo x pelo nome do arquivo e decodificando o arquivo para outro canal. No novo pipe lame processa a saída do flac para mp3 em / media. Quero que os xargs alcancem o canal de alguma forma, substituindo o x no comando lame ou, de alguma forma, enviem 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 existem dados reais sendo canalizados entre os dois comandos me deixa muito irritado.

sagev9000
fonte

Respostas:

16

Se bem entendi, você deseja acionar uma instância flac … | lame …para cada linha de entrada e interpolar a entrada nos argumentos dos dois comandos.

Como você precisa xargsiniciar 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, faça com que o shell de chamada leia as linhas uma por 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

Observe que o formato %w%fproduz um caminho absoluto, ao qual você está /media/1tbanexando e anexando .mp3. Se você deseja remover a parte do diretório do arquivo no lamecomando, altere $filepara ${file##*/}. Se você deseja retirar o ramal, mude $filepara ${file%.*}. Se você quiser fazer as duas coisas, precisará fazê-lo em duas etapas. Se você deseja reproduzir a hierarquia de diretórios abaixo /media/1tb, você pode usar 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- parar de ser mau'
fonte
3

Você pode 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;
Cachinhos Dourados
fonte
1
while read …é uma solução, mas depois solte xargs. O que você escreveu simplesmente não faz sentido: de onde você acha que xargsestá recebendo sua contribuição? E você deve citar as coisas corretamente, é comum que os nomes dos arquivos de música contenham espaços.
Gilles 'SO- stop be evil'
@Gilles Não estava claro para mim exatamente o que o OP está fazendo, e foi por isso que eu disse "você poderia tentar algo como " e "não tenho certeza se o bit xargs é fiel às suas intenções" etc. Portanto, não a melhor resposta, mas uma dica na direção certa, eu acho. Corrigimos o problema de cotação e removemos xargs.
Goldilocks