mv reclama da entrada padrão em um pipeline que filtra o nome do arquivo com grep

2

Estou tentando mover vários arquivos .avi com espaços de um CD para minha pasta pessoal. Eu já sei como me livrar dos espaços:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

Mas estou com dificuldades para encontrar os arquivos editados e movê-los em massa para a pasta. Eu continuo recebendo o erro mv: cannot stat '(standard input)': No such file or directory . Este é o código que estou tentando usar:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

Alguém pode me dizer o que estou fazendo de errado?

    
por Xanpheon 17.10.2013 / 12:42

2 respostas

3

Seu problema é a -L mudar para grep . Na página do manual:

L, --files-without-match
Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match.

Portanto, em vez de listar os nomes de arquivos que não correspondem a avi , ele lista apenas o lugar em que grep não encontrou avi . Como grep geralmente procura em um arquivo, esse switch listaria nomes de arquivos que não continham o padrão avi dentro deles. No seu caso, no entanto, como você está direcionando para grep de find , o arquivo que grep está lendo é (standard input) . Para ver o que quero dizer, tente:

find /media/mathscd | grep -L "*.avi"

resultado:

(standard input)

Em outras palavras, grep encontrou linhas que não correspondem a "*.avi" na entrada padrão, que é exatamente o que aconteceu.

Como find lista nomes de arquivos diretamente, você só precisa inverter o sentido da correspondência:

find /media/mathscd | grep -v ".*\.avi"

(observe que os padrões grep são diferentes dos curingas do shell; você também não precisa da opção -r )

Além disso, usando find sozinho:

find /media/mathscd ! -name "*.avi"
    
por 17.10.2013 / 13:47
2

Experimente um destes:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

Certifique-se de testá-lo substituindo xargs mv* por xargs ls primeiro.

    
por 17.10.2013 / 13:06