Remove todos os arquivos por nome de arquivo (Linux one-liner)

2

O CakePHP tem uma convenção de colocar arquivos chamados "vazios" em diretórios vazios. Tenho certeza de que eles têm uma razão, mas isso realmente me incomoda. (Sim, TOC, eu sei ...)

Eu quero um comando linux shell de uma linha que irá deletar todos os arquivos com o nome "empty" em todos os diretórios descendentes. (Eu suponho que seria útil poder especificar curingas para um uso mais geral também.)

Alguma idéia?

    
por Tom Wright 10.06.2009 / 14:24

4 respostas

14

O mais simples é:

encontre. -name empty -type f -exec rm -f {} \;

"." inicia no diretório atual, substitua por um caminho de diretório se você quiser executá-lo em outro local.

"- tipo f" apenas garante que seja um arquivo.

    
por 10.06.2009 / 14:28
3

Resumo resumido:

Existem várias opções:

find . -name empty -type f -exec rm -f {} \;

chamará rm uma vez para cada arquivo

find . -name empty -type f -exec rm -f {} +

chamará rm somente quantas vezes forem necessárias construindo uma linha de comando que use o comprimento máximo possível

find . -name empty -type f | xargs rm -f

mesmo que acima, você pode (ou melhor, como acima - que foi minha abordagem) encontrar problemas com nomes de arquivos que contenham caracteres que precisam ser citados

find -name empty -type f -print0 | xargs -0 rm -f

é provavelmente a melhor solução Por favor, comente o comentário de Dan C, é a sua solução . Ele será como a chamada de fragmento anterior rm apenas quantas vezes for necessário construindo uma linha de comando que use o comprimento máximo possível, a opção -0 significa que os argumentos para o comando rm serão separados por -type f , escapar é feito diretamente no shell.

Em uma nota sobre o comentário a restringir usando -size 0 você também pode restringir com -v (exatamente 0 bytes) Eu não posso verificar se o CakePHP realmente adere a essa convenção, mas apenas sobre cada projeto eu sei que usa arquivos de espaço reservado para verificar diretórios vazios nos repositórios de origem.

Além disso, Matt Simons ressalta que adicionar uma strace -p $pid_of_xargs flag pode ser uma boa opção para ver algum progresso, mas note que isso definitivamente irá desacelerar todo o processo. Uma abordagem melhor pode ser seguir o processo usando %code% (adicionar opções adicionais se você quiser seguir processos filhos, afaik que é possível)

Outra nota que encontrei na página do manual:

find -name empty -type f -delete

depois de tudo encontrar tem tudo isso embutido:)

    
por 10.06.2009 / 15:34
2

Uma possível razão pela qual o CakePHP pode fazer isso é porque alguns sistemas de controle de versão (por exemplo, Mercurial e Git) não podem rastrear diretórios vazios.

    
por 10.06.2009 / 14:38
-2

Isso pode ser feito:

rm -f $(find /var/www -name empty -print)

Encontrar recurses por padrão.

    
por 10.06.2009 / 14:27