Como excluir recursivamente todos os arquivos JPG, mas manter aqueles que contêm “amostra”

Como excluir recursivamente todos os arquivos JPG, mas manter aqueles que contêm “amostra”

Como posso encontrar e excluir todos os .jpgarquivos em uma árvore de diretórios, com exceção daqueles que contêm “amostra” no nome do arquivo?

Por exemplo :

a.zip          ->  keep it  
b.jpg          ->  delete it  
a-sample.jpg   ->  keep it  
b-Sample.jpg   ->  keep it  

Responder1

Para excluir todos os arquivos que terminam em . jpg(sem distinção entre maiúsculas e minúsculas), exceto para arquivos com samplenome de arquivo (sem distinção entre maiúsculas e minúsculas:

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

Isso se repete em todos os diretórios da árvore, começando no diretório atual.

Como funciona:

  • .

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

  • ! -iname '*sample*'

    Isso instrui finda ignorar todos os arquivos com sampleseus nomes. O iin -inametorna este teste insensível a maiúsculas e minúsculas.

  • -iname '*.jpg'

    Esta condição, que é igual à anterior, procura arquivos que terminam em .jpg.

  • -delete

    Isso instrui finda excluir todos esses arquivos.

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

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

Isso imprimirá os arquivos de interesse. Se esta lista for boa, execute o comando novamente com -deleteo anexo.

Responder2

No bash, você pode usar

shopt -s extglob

para ativar a correspondência negativa:

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

Para corresponder às subpastas também, ative

shopt -s globstar

e use a estrela dupla:

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

informação relacionada