rm *\).MOV
Encontrei vários exemplos que funcionam desde que não haja espaços nos nomes dos arquivos. Infelizmente, eu tenho espaços em meus nomes de arquivos (não minha escolha, na verdade eles são os que eu preciso remover).
Então, por exemplo, isso é o que eu pensei que funcionaria:
encontre. tipo f | grep) .MOV | xargs rm
porque eu quero excluir os arquivos como:
e eu quero manter os arquivos como
Isso encontra os arquivos corretamente:
encontre. tipo f | grep) .MOV
mas quando eu canalizo para rm, os espaços no nome do arquivo estragam tudo.
Qualquer ajuda seria muito apreciada.
Diga a xargs
para usar novas linhas como delimitadores:
find . -type f | grep ).MOV | xargs -d'\n' rm
Melhor, tenha find
fazendo a correspondência e use -print0
e xargs -0
para permitir qualquer caractere nos nomes dos arquivos, mesmo \n
!
find . -type f -name '*).MOV' -print0 | xargs -0 rm
Melhor ainda, basta ter find
chamada rm
diretamente.
find . -type f -name '*).MOV' -exec rm {} +
Melhor, pule rm
e tenha find
fazendo a exclusão.
find . -type f -name '*).MOV' -delete
Ou, neste caso específico, quem precisa de todo o maquinário pesado?
rm *\).MOV
Tente isto:
find . -name "*).MOV" -exec rm {} \;
Muitas ferramentas unix são frágeis (ou, pelo menos, difíceis de usar corretamente) na presença de nomes de arquivos contendo espaços e tabulações ou, pior ainda, novas linhas, portanto, quando você tiver uma escolha, evite esses caracteres em nomes de arquivos.
No entanto, se você quiser remover todos os arquivos no diretório atual (e todos os subdiretórios) com um espaço no nome, o seguinte funcionará.
find . -name '* *' -print0 | xargs -0 rm -f
A opção -print0
diz ao find para usar o byte NUL (\ 0) como o separador entre os nomes dos arquivos em vez de NL (\ n). Por outro lado, -0
diz ao xargs para usar o NUL como o separador de linha em vez de NL. Altere o argumento de padrão para a opção -name
conforme necessário para corresponder aos arquivos que você deseja remover.
Pode ser um pouco complicado impedir que find
recorra a subdiretórios (apesar de verificar o argumento -maxdepth
), portanto, se desejar apenas afetar arquivos no diretório atual, convém abordar o problema de maneira diferente.
No geral, recomendo strongmente que você se torne fluente com find
e xargs
. Individualmente, e especialmente quando encadeados como mostrado acima, eles fazem um kit de ferramentas extremamente flexível para operações de arquivos em massa.
Na maioria das instalações Unix, você pode denotar um espaço em um nome de arquivo, prefixando-o com uma barra invertida. Por exemplo, tente isso:
mkdir blah
cd blah
touch file1
touch file2
touch "file 3"
touch "file 4"
Faça um "ls" e você verá isto:
arquivo 3 arquivo 4 arquivo1 arquivo2
Agora faça "ls * \ *" e você verá tudo com um espaço:
arquivo 3 do arquivo 4
Então, talvez apenas um "rm * \ *" seja tudo o que você precisa? Ou modifique essa expressão regular para atender às suas necessidades.
Espero que ajude!
Tags unix