Comando mais curto para excluir arquivos

5

Nosso servidor da Web foi originalmente mantido por uma empresa diferente. Eles escreveram um pequeno script para limpar os arquivos em cache. O arquivo deles tem várias linhas que são assim:

/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1

Existe algum motivo para eles não poderem escrever:

/bin/rm -f /var/www/cache/blah/*

para apagar os arquivos? Eu posso ver usando find quando você precisa de um critério específico, mas não consigo encontrar um neste caso.

    
por Tensigh 20.11.2014 / 07:24

3 respostas

7

Existem algumas diferenças no comportamento das linhas de comando:

  1. A linha de comando find excluiria arquivos recursivamente em subdiretórios , a linha de comando rm não. Você precisa considerar se deseja ou não reciclar.
  2. A linha de comando find excluiria todos os arquivos, se possível. A linha de comando rm pode pular arquivos com base nas configurações do shell, como GLOBIGNORE . Você precisa considerar se deve ou não haver nomes de arquivos que possam ser acidentalmente ignorados na expansão do nome do caminho.
  3. A linha de comando find seria bem sucedida para qualquer número de arquivos . A linha de comando rm pode falhar se a expansão do nome do caminho criar uma linha de comando longa demais (maior que o sistema suporta). Alguns sistemas têm limites sobre isso. Você precisa considerar quantos arquivos podem precisar ser excluídos.
  4. A linha de comando find ignora todas as mensagens de saída (usando os redirecionamentos para >/dev/null ). A linha de comando rm imprime as mensagens de saída. Você precisa considerar o que deve acontecer com as mensagens.

Se essas diferenças não forem importantes para você, /bin/rm -f /var/www/cache/blah/* funcionará para você.

Se apenas arquivos devem ser removidos e diretórios devem ser mantidos, eu usaria

/usr/bin/find /var/www/cache/blah/ -not -type d -exec /bin/rm -f -- {} + >/dev/null 2>&1

ou

/usr/bin/find /var/www/cache/blah/ -type f -exec /bin/rm -f -- {} + >/dev/null 2>&1

o que for adequado ao seu objetivo, ambos têm prós e contras.

-exec command {} + funciona como xargs , mas é um pouco mais eficiente. O -- impede que rm caia se um dos nomes de arquivos começar com - . Além disso, xargs foi usado de uma maneira que faz muitas suposições sobre nomes de arquivos. Caracteres especiais como espaço, na verdade, quebrariam a simples invocação de xargs . Algo como find ... -print0 | xargs -0 seria necessário e, em seguida, o find -exec command {} + é muito mais simples.

    
por 20.11.2014 / 07:48
8

Algumas razões pelas quais posso pensar por que usaram find + xargs :

  • Como lidar com o caso quando você tem muitos arquivos de cache, levando a um erro se você executar apenas um comando rm .

  • Globbing * não expande arquivos ocultos.

  • Trabalhando recursivamente.

Mas esse find + xargs não é eficiente, pois quando não adicionaram nenhum filtro, o find result conterá diretórios e arquivos. A execução de /bin/rm -f em um diretório leva a um erro. Por isso, os stderr e stdout são redirecionados para /dev/null . E com arquivos esses nomes contém caracteres especiais, o comando também falhará.

Uma solução aprimorada pode ser:

find /var/www/cache/blah -type f -exec rm -f -- {} +

Isso é mais eficiente, fazendo todos os trabalhos com find , bifurcações mínimas de rm e POSIXly.

    
por 20.11.2014 / 07:44
2

As outras respostas perdem três pontos:

Nunca faça isso:

/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1

porque quando você tem um arquivo com um espaço, rm tentará remover dois arquivos, com resultados surpreendentes.

Se você insistir em fazer dessa maneira, supondo que esteja usando o GNU find e xargs , você deseja:

/usr/bin/find /var/www/cache/blah/ -print0 | xargs -0 /bin/rm -f >/dev/null 2>&1

que zero finaliza os arquivos (e espera terminação zero em xargs).

Em segundo lugar, você está tentando excluir diretórios ou não? Se não, você quer '-tipo f'. Se assim for, você quer 'rm -rf' como rm sem -r não irá remover um diretório.

Mas o mais importante é que o OP pediu um método mais curto e as respostas parecem ser mais longas. Que tal:

/usr/bin/find /var/www/cache/blah/ -delete

Acredito que -delete é uma extensão do GNU, portanto, verifique se sua versão de find é compatível.

    
por 20.11.2014 / 13:53