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

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

Estou tentando mover vários arquivos .avi que possuem espaços de um CD para minha pasta pessoal. 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 lutando para encontrar os arquivos editados e movê-los em massa para a pasta. 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?

Responder1

Seu problema é a -Lmudança para grep. Na página de manual:

L, --files-without-match
Suprime a saída normal; em vez disso, imprima o nome de cada arquivo de entrada do qual normalmente nenhuma saída seria impressa. A varredura irá parar na primeira partida.

Então, em vez de listar osnomes de arquivosque não correspondem aviapenas lista oslugaronde grepnão encontrei avi. Como grepgeralmente aparece em um arquivo, essa opção listaria nomes de arquivos que não contêm o padrão avidentro deles. No seu caso, entretanto, como você está canalizando grepfrom find, o arquivo que grepestá lendo é (standard input). Para ver o que quero dizer, tente:

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

resultado:

(standard input)

Em outras palavras, grepforam encontradas linhas que não correspondiam "*.avi"à entrada padrão, e foi exatamente o que aconteceu.

Como findlista os nomes dos arquivos diretamente, você só precisa inverter o sentido da correspondência:

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

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

Além disso, usando findsozinho:

find /media/mathscd ! -name "*.avi"

Responder2

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*pelo xargs lsprimeiro.

informação relacionada