
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 -L
mudanç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 avi
apenas lista oslugaronde grep
não encontrei avi
. Como grep
geralmente aparece em um arquivo, essa opção listaria nomes de arquivos que não contêm o padrão avi
dentro deles. No seu caso, entretanto, como você está canalizando grep
from 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
foram encontradas linhas que não correspondiam "*.avi"
à entrada padrão, e foi exatamente o que aconteceu.
Como find
lista os nomes dos arquivos diretamente, você só precisa inverter o sentido da correspondência:
find /media/mathscd | grep -v ".*\.avi"
(observe que grep
os padrões são diferentes dos curingas do shell; você também não precisa da -r
opção)
Além disso, usando find
sozinho:
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 ls
primeiro.