Por que meu duto não funciona?

2

Estou tentando criar um script bash que encontre todos os mp3s na minha pasta Downloads e mova-os para uma pasta de músicas. Por que essa linha não funciona?

find ./ -type f -name \*.mp3 | mv *.mp3 /home/mitch/Desktop/Music/$ARTIST

Eu tentei usar um pipeline para fazer com que as informações do primeiro comando fossem traduzidas para o segundo, mas nunca usei um pipeline antes e não sei se estou fazendo errado ou se tenho uma ideia errada do que eles são usados para.

    
por LurkDog 01.03.2012 / 07:38

2 respostas

5

O comando mv não usa seu stdin, então você tem que traduzir o stdin para um parâmetro, e para isso pode ser usado xargs :

find ./ -type f -name '*.mp3' | xargs mv -t /home/mitch/Desktop/Music/$ARTIST

Além disso, você pode usar diretamente a ação -exec de find :

find ./ -type f -name '*.mp3' -exec mv {} /home/mitch/Desktop/Music/$ARTIST ';'

Editar

Como apontado por @geirha, o primeiro comando não funciona se você tiver nomes de arquivos contendo espaços. Nesse caso, deve ser o seguinte

find ./ -type f -name '*.mp3' -print0 | xargs -0 mv -t /home/mitch/Desktop/Music/$ARTIST
    
por enzotib 01.03.2012 / 07:45
0

A vantagem do xargs é a expansão da linha de comando. Se você tivesse um comando que retornasse uma grande quantidade de texto (ou muitos arquivos em um único comando), você precisaria de xargs.

Se você tivesse vários milhares de arquivos em um diretório e quisesse executar algum script nessa lista, você poderia tentar " ./myprogram * ", mas se o seu programa tiver algum limite no tamanho de um parâmetro, você pode explodir o buffer expandindo *. Além disso, a própria linha de comando tem limites, portanto, o comando pode falhar porque o buffer da linha de comando está saturado. O uso de xargs evitará o problema.

por fim, o -print0 em find colocará delimitadores nulos para espaços nos nomes de arquivos retornados, e a opção -0 em xargs interpretará esses nulos. Leia man xargs .

    
por Hey Gary 02.09.2012 / 01:53