Quero remover arquivos que não tenham a sequência '999' (sem a '') 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.
grep -l
faz com que ele liste os arquivos nos quais uma correspondência foi encontrada (ou não encontrada-v
) no conteúdo , não no nome do arquivo.grep
sempre corresponde ao conteúdo dos arquivos que você especificar, nunca aos nomes.Respostas:
Usando um padrão de globbing estendido em
bash
:Isso precisa
shopt -s extglob
estar ativado (e também por segurança,shopt -s failglob
para que nenhum arquivo com o nome incomum!(*999*)
seja removido por engano se todos os nomes de arquivos contiverem999
). O padrão!(*999*)
corresponderá a qualquer nome no diretório atual, exceto os nomes correspondentes*999*
. Para também remover arquivos ocultos (arquivos cujo nome começa com um ponto ), ative também adotglob
opçãoPara se importar apenas com arquivos regulares ou links simbólicos para arquivos regulares (não diretórios etc.):
O
zsh
shell equivalente ao loop acima seriaSeu primeiro comando não funcionará, pois
grep
procurará nos arquivos. Ele removeria todos os arquivos que possuem linhas sem999
eles (se você tivesse adicionado a--null
opção para que ela funcionexargs -0
).Seu segundo comando não funcionará, pois o
grep
macOS não suporta--null-data
(no entanto, ele tem uma--null
opção, mas apenas para gerar a saída do nome do arquivo). Observe também que ele procuraria999
qualquer lugar no caminho do arquivo (incluindo componentes de diretório), não apenas o nome do arquivo.fonte
failglob
opção ou ela pode remover o arquivo chamado!(*999*)
se não houver outro arquivo cujo nome não contenha999
.Basta inverter a condição de nome em
find
:Adicione
-delete
ou-exec rm {} +
realmente remova os arquivos correspondentes.fonte
!
está segurobash
.