Remova os arquivos que começam com mas não contêm

5

Estou tentando remover muitos arquivos de uma só vez, mas preciso ser específico para não remover nenhum arquivo que realmente precise.

Eu tenho uma tonelada de arquivos corrompidos que iniciam master - mas existem arquivos válidos que começam com master-2018

Então, eu quero fazer algo como

rm -rf master-* --exclude master-2018*

Isso é necessário?

    
por Dan James Palmer 07.11.2018 / 00:02

3 respostas

17

Sim, você pode usar mais de um padrão com find :

$ find -name 'master-*' \! -name 'master-2018*' -print0 -prune |
     xargs -0 echo rm -fr

(remova o echo se estiver satisfeito com a execução a seco)

Você deve adicionar um predicado -maxdepth 1 logo após find se desejar apenas ro remover arquivos do diretório atual, ou seja, master-1991 , mas não subdir/master-1991 .

    
por 07.11.2018 / 00:32
10

No bash:

shopt -s extglob
echo rm master-!(2018*)

Remova o echo se ele estiver correto.

O exemplo acima usa o recurso de globbing estendido do bash para corresponder arquivos que começam com master- , mas que não têm 2018 imediatamente após, seguido por qualquer coisa ( * ).

    
por 07.11.2018 / 00:44
0

Se todos os arquivos que você deseja excluir tiverem um padrão como master-YYYY *, você poderá usar esses padrões:

rm -rf master-???[0-79]*
rm -rf master-??[02-9]*
rm -rf master-?[1-9]*
rm -rf master-[013-9]*

O objetivo é omitir dígitos de um número de ano, portanto, em primeiro lugar depois do mestre - precisamos omitir (não remover) o dígito 2, o segundo dígito 0, o terceiro dígito 1 e o 4º lugar - dígito 8 Eu tentei apenas um minuto antes, e é o suficiente para executar apenas os dois primeiros.

Segundo método: Você pode mover o master-2018 para outro diretório, por exemplo, / tmp, em seguida, remova tudo com master- * e retorne seu master-2018 a partir do tmp.

mkdir /tmp/backup
mv -r master-2018* /tmp/backup
rm -rf master-*
mv -r /tmp/backup/* .
    
por 07.11.2018 / 00:18