Como excluo todos os arquivos que contêm uma determinada string em um diretório no UNIX?

3

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:

  • L112 (1) .MOV
  • L113 (1) .MOV
  • L113 (2) .MOV
  • etc.

e eu quero manter os arquivos como

  • L112.MOV
  • L113.MOV
  • L114.MOV
  • etc.

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.

    
por Craig Nakamoto 26.08.2009 / 21:19

5 respostas

5

rm *\).MOV
    
por 26.08.2009 / 21:24
4

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
    
por 26.08.2009 / 21:26
1

Tente isto:

find . -name "*).MOV" -exec rm {} \;
    
por 26.08.2009 / 21:24
1

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.

    
por 27.08.2009 / 04:17
0

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!

    
por 26.08.2009 / 21:25

Tags