Linux, localize todos os arquivos correspondentes ao padrão e exclua

5

Procura encontrar todos os arquivos (recursivamente) que tenham um sublinhado no nome do arquivo e, em seguida, exclua-os por meio da linha de comando.

    
por Louis W 09.01.2014 / 16:17

4 respostas

11

Esta é a variante mais segura e mais rápida:

find /path -type f -name '*_*' -delete

Ele não requer piping e não quebra se os arquivos contiverem espaços ou caracteres globbing ou qualquer outra coisa que outras construções possam bloquear. A regra mais fácil de lembrar aqui é nunca analisar find output . E nunca grep em nomes de arquivos se você quiser fazer alguma coisa com eles mais tarde. Você pode fazer quase tudo com find diretamente.

Veja também: GNU find Manual - Excluindo arquivos

    
por 09.01.2014 / 16:31
2

Isso inclui diretórios que são considerados arquivos. Alguns dos outros exemplos usando xargs falharão se o nome do arquivo contiver espaços.

find . -name '*_*' -exec rm -rf {} \;

Se você quer apenas arquivos regulares:

find . -type f -name '*_*' -exec rm -f {} \;
    
por 09.01.2014 / 16:30
0

Tudo bem, vamos fazer isso progressivamente.

Como primeiro passo, este é apenas um exercício simples ao passar um curinga ao comando find , lembrando-se de citar, é claro, e executar o comando rm para cada arquivo encontrado:

find ${BASE_DIR}/ -name '*_*' -exec rm {} \;

Mas é claro que isso é terrivelmente ineficiente. Ele inicia um processo rm inteiro para cada arquivo individual. Então, enquanto nós poderíamos fazer um pequeno desvio através de \+ , não é para onde vamos acabar, então vamos pegar a rota mais curta e trazer xargs para agrupar os nomes dos arquivos em grupos:

find ${BASE_DIR}/ -name '*_*' -print | xargs rm

Mas isso tem dois buracos de segurança. Primeiro, se algum nome de arquivo encontrado começar com um sinal de menos rm irá tratá-lo como uma opção de linha de comando em vez de um nome de arquivo, e gerará um erro. (A versão -exec rm {} também tem esse problema.) Segundo, nomes de arquivos contendo espaço em branco não serão tratados corretamente por xargs . Então, uma nova iteração é tornar isso um pouco mais à prova de balas:

find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm --

E, claro, existem os recursos interativos de rm que você provavelmente não deseja:

find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm -f --

As opções -print0 e -0 não são padrão, mas o% GNUfind e xargs , assim como o FreeBSD find e xargs , os entendem. No entanto, até isso é improvável. Nós não precisamos gerar nenhum processo extra. O GNU e o FreeBSD find s podem invocar a chamada do sistema unlink(2) diretamente:

find ${BASE_DIR}/ -name '*_*' -delete

Como última medida preventiva para impedir que você faça mais do que pretendia em determinadas circunstâncias, lembre-se de que o sistema de arquivos pode conter mais do que apenas arquivos regulares:

find ${BASE_DIR}/ -name '*_*' -type f -delete
    
por 09.01.2014 / 17:06
-2

find . -type f -regex ".*_.*" | xargs rm -f

explanação
-type f encontra apenas arquivos
-regex ".*_.*" seleciona apenas arquivos que têm um sublinhado neles
xargs rm -f remove o arquivo selecionado com força (nunca solicita antes de excluir)

    
por 09.01.2014 / 16:25

Tags