Respostas:
Usando um padrão de globbing estendido em bash
:
rm ./!(*999*)
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 contiverem 999
). 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 a dotglob
opção
Para se importar apenas com arquivos regulares ou links simbólicos para arquivos regulares (não diretórios etc.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
O zsh
shell equivalente ao loop acima seria
rm ./(^(*999*))(.)
Seu primeiro comando não funcionará, pois grep
procurará nos arquivos. Ele removeria todos os arquivos que possuem linhas sem 999
eles (se você tivesse adicionado a --null
opção para que ela funcione xargs -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 procuraria 999
qualquer lugar no caminho do arquivo (incluindo componentes de diretório), não apenas o nome do arquivo.
failglob
opção ou ela pode remover o arquivo chamado !(*999*)
se não houver outro arquivo cujo nome não contenha 999
.
Basta inverter a condição de nome em find
:
find . -type f \! -name "*999*"
Adicione -delete
ou -exec rm {} +
realmente remova os arquivos correspondentes.
!
está seguro bash
.
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.