Como recursivamente excluir todos os arquivos JPG, mas mantenha os que contenham “sample”

2

Como posso encontrar e excluir todos os arquivos .jpg em uma árvore de diretórios, com exceção daqueles que contêm "amostra" em seu nome de arquivo?

Por exemplo:

a.zip          ->  keep it  
b.jpg          ->  delete it  
a-sample.jpg   ->  keep it  
b-Sample.jpg   ->  keep it  
    
por tachikoma01 15.04.2015 / 22:32

2 respostas

7

Para excluir todos os arquivos terminados em. jpg (sem distinção entre maiúsculas e minúsculas), exceto para arquivos com sample no nome do arquivo (sem distinção entre maiúsculas e minúsculas:

find . ! -iname '*sample*'  -iname '*.jpg' -delete

Isto recorre através de todos os diretórios na árvore, começando no diretório atual.

Como funciona:

  • .

    Isso especifica que começamos com o diretório atual.

  • ! -iname '*sample*'

    Isso instrui find a ignorar todos os arquivos com sample em seus nomes. O i em -iname torna este teste insensível ao caso.

  • -iname '*.jpg'

    Esta condição, que é e com a anterior, procura arquivos que terminem em .jpg .

  • -delete

    Isso instrui find a excluir todos esses arquivos.

Antes de executar o comando acima, você pode querer testá-lo. Executar:

find . ! -iname '*sample*'  -iname '*.jpg'

Isso imprimirá os arquivos de interesse. Se essa lista estiver boa, execute o comando novamente com -delete anexado.

    
por 15.04.2015 / 22:47
2

No bash, você pode usar

shopt -s extglob

para ativar a correspondência negativa:

rm !(*[Ss]ample*).jpg

Para corresponder também às subpastas, ative

shopt -s globstar

e use a estrela dupla:

rm **/!(*[Ss]ample*).jpg
    
por 15.04.2015 / 22:47