Removendo todos os arquivos que contêm uma string no nome deles

0

Existe uma ferramenta de linha de comando que remove tudo o que whereis retorna (mesmo que sejam diretórios), mas funciona mesmo com nomes parciais (por exemplo, se eu der a string gmai , também excluirá arquivos nomeados gmail ).

Portanto, examine de forma recursiva todos os diretórios e exclua o conteúdo daqueles que contêm uma string em seu nome.

e. g. Se os diretórios forem mail/gmail/sentmail , exclua tudo abaixo de gmail .

    
por Nesa 20.02.2018 / 18:03

2 respostas

5

Se você realmente quiser fazer isso, use estas encontre comando, mas você deve testar antes sem a opção -delete para testar se é o que você espera:

find ./mail -depth -path '*gmai*' -delete

É recursivo em todas as sub-dirs

Com a ajuda do comentário de @David Foerster e meu comando original

    
por Gilles Quenot 21.02.2018 / 00:47
2

whereis(1) não parece adequado ao seu propósito, já que não é geral ferramenta de busca de nome de caminho de propósito.

Sem um índice de pesquisa

Como Gilles observou em sua resposta, você pode usar find(1) para este trabalho mas eu quero fazer uma pequena melhoria significativa 1 :

find [PATH...] -depth -path '*gmai*' -print # -delete

Explicação:

  • find [PATH...] passa por todos os arquivos e subdiretórios abaixo de cada PATH ou dos diretórios de trabalho atuais, se nenhum caminho foi fornecido, e imprime todas as correspondências (por padrão).

  • -path PATTERN corresponde a caminhos completos contra PATTERN usando globbing se houver, portanto *gmai* corresponde a todos os nomes de caminho com infix gmai .

  • -delete exclui todos os caminhos correspondentes (e substitui a ação padrão para imprimi-los).

  • -depth instrui find para corresponder aos filhos antes dos pais, i. e. entradas de diretório antes dos próprios diretórios pai. É necessário excluir crianças antes de seus pais, porque, na semântica do sistema de arquivos Unix, apenas os diretórios vazios podem ser excluídos.

  • -print imprime todos os caminhos correspondentes. Use isso para verificar o resultado antes da exclusão real. Comente no comando -delete (removendo # na frente dele) para excluí-los.

Com um índice de pesquisa

Se todos os locais que você pretende excluir aparecerem no mlocate.db(5) você pode usá-lo para pesquisas mais rápidas:

locate '/your/parent/path/*gmai*'

pesquisa todos os caminhos (indexados) que começam com /your/parent/path/ e têm um infix gmai no restante. Este comando só lista os resultados da pesquisa.

Para excluir os resultados, use:

locate -0 '/your/parent/path/*gmai*' | xargs -r -0 -- rm -rf --

Explicação:

  • | redireciona a saída do comando do lado esquerdo para a entrada do comando do lado direito.

  • xargs coleta "itens" de sua entrada, acrescenta para um determinado comando e executa esse comando.

  • -r faz xargs não executar o comando se nenhum item de entrada ocorrer.

  • rm -rf remove arquivos e diretórios recursivamente

  • -0 indica locate para delimitar correspondências por nulos-bytes e xargs para aceitar itens de entrada separados por nulo. Isso evita problemas com nomes de caminhos que contêm espaços em branco e, mais especificamente, caracteres de quebra de linha.

1 que ele incorporou em sua resposta antes que a questão fosse reaberta e me permitisse responder.

    
por David Foerster 22.02.2018 / 14:22