Remove arquivos sem string no nome

8

Eu quero remover arquivos que não tenham a string '999' (sem o '') em seu nome.

Eu tentei:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Mas nenhum deles funciona. Estou usando o macOS Sierra, com o bash: 3.2.57.

    
por plr 15.05.2018 / 20:36

2 respostas

14

Usando um padrão de globbing estendido em bash :

rm ./!(*999*)

Isso requer que shopt -s extglob esteja habilitado. O padrão !(*999*) corresponderá a qualquer nome no diretório atual, exceto os nomes correspondentes a *999* .

Para se preocupar apenas com arquivos regulares (não diretórios, etc.):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

Seu primeiro comando não funcionará, pois grep irá procurar dentro dos arquivos. Ele removeria todos os arquivos que possuem linhas sem 999 (você adicionou a opção --null para que funcione com xargs -0 ).

Seu segundo comando não funcionará, pois grep no macOS não suporta --null-data (ele tem, no entanto, uma opção --null , mas apenas para gerar a saída do nome do arquivo). Observe também que ele procuraria 999 em qualquer lugar no caminho do arquivo (incluindo os componentes do diretório), não apenas o nome do arquivo.

    
por 15.05.2018 / 21:06
14

Basta inverter a condição do nome em find :

find . -type f \! -name "*999*" 

Adicione -delete ou -exec rm {} + para realmente remover os arquivos correspondentes.

    
por 15.05.2018 / 20:56