Remove todos os arquivos sem uma palavra-chave no nome do arquivo

1

Eu tenho uma lista de arquivos da seguinte maneira:

> file1.jpg 
> file1_orig.jpg 
> file2.jpg 
> file2_orig.jpg

Eu quero manter todos os arquivos com a extensão _orig.jpg e descartar aqueles sem. Como isso pode ser alcançado usando o bash?

    
por adampski 17.08.2014 / 12:18

2 respostas

4

Você pode usar a expansão de nome de arquivo estendido do Bash :

rm !(*_orig.jpg)

A sintaxe !(pattern) :

Matches anything except one of the given patterns.

, então isso se expande para todos os nomes de arquivos que não correspondem a *_orig.jpg , que você pode excluir (ou sair do caminho). Você precisa ter a opção extglob habilitada, o que você pode fazer com shopt -s extglob antecipadamente (caso contrário, você receberá um erro no formulário "evento não encontrado"). É comumente ativado por padrão, no entanto.

Como alternativa e portável, você pode simplesmente mover os arquivos que deseja manter fora do caminho temporariamente e excluir o restante:

mkdir tmp
mv *_orig.jpg tmp
rm *.jpg
mv tmp/*.jpg .
rmdir tmp

Existem opções que também usam find :

find . -type f ! -name '*_orig.jpg' -exec rm '{}' +

Isso encontrará todos os arquivos (regulares) recursivamente no diretório atual que não são denominados *_orig.jpg e os excluem; esta é a sua melhor opção (mas não apenas) se os arquivos não estiverem todos diretamente dentro de um diretório.

    
por 17.08.2014 / 12:28
1

maneira POSIX:

$ find . \( ! -name . -prune -a -name "*.jpg" -a ! -name "*_orig.jpg" \) -exec rm -- {} +
    
por 17.08.2014 / 12:59