Removendo vários arquivos de uma lista gigante (Argument list too long)

Publicado por Luiz Henrique de Lima Siqueira em 11/03/2008

[ Hits: 43.504 ]

 


Removendo vários arquivos de uma lista gigante (Argument list too long)



Não é todo sistema ou servidor que dá para automatizar a questão de apagar os logs, ou então, nem sempre é interessante apagá-los automaticamente. Por experiência própria, vez por outra preciso apagar vários arquivos gigantescos (geralmente logs) de uma única vez e a seguinte mensagem é gerada:

/bin/rm Argument list too long (Lista de argumento muito longa)

Bom, caso este seja o seu caso, basta entrar no diretório onde encontram-se os arquivos e executar algumas das alternativas de comando.

Para apagar todos os arquivos que contenham "2008" em seu nome:

$ for a in *2008*; do rm $a; done

Para apagar todos os arquivos que possuam a extensão .log:

$ for a in *.log; do rm $a; done

Espero que seja útil a muitos.

Abraço.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Comandos para a distribuição Solus OS - Gerenciamento de Pacotes

Criando o comando grub-update no Fedora

Limite de banda (bandwidth) nos comandos scp e rsync

Processos de usuário em segundo plano e como manipulá-los

Vídeo do LinuxTips - Descomplicando o Docker - Parte 2

  

Comentários
[1] Comentário enviado por removido em 12/03/2008 - 10:15h

Mais simples, você pode usar o asterisco diretamente no rm:

$ rm *2008*
$ rm *.log

[2] Comentário enviado por frikasoide em 12/03/2008 - 10:36h

Ola xisberto, acredito que você ainda não teve problemas no qual se refere essa Dica, no caso, erro de Argument list too long. Pesquise no Google sobre isso e você encontrará diversas pessoas com essa dificuldade. De qualquer forma, obrigado pela participação.

[3] Comentário enviado por removido em 12/03/2008 - 10:58h

Sim, frikasoide, já tive esse tipo de problema. Mas só agora, lembrando de como eu enfrentei o problema, eu entendi o espírito da sua dica.

Do jeito que usei, eu apenas tentava diminuir o número de argumentos por uma lista menor, mas tinha que passar várias listas em vários comandos rm.

Na sua dica, o comando rm é chamado várias vezes, cada uma com apenas um argumento. Se você tivesse dito isto lá na dica, eu só teria pensado "puxa vida, como fui burro", hehehehe

[4] Comentário enviado por frikasoide em 12/03/2008 - 11:01h

Tranquilo xisberto!
Abraço

[5] Comentário enviado por SMarcell em 12/03/2008 - 13:21h

Outra alternativa seria utilizando o find em pipe com xargs. Ex.:

find <diretorio> -type f -name "*.log" | xargs -O rm

Desse modo o find passaria a lista de todos os arquivos de log para o xargs que por sua vez, passaria o máximo de argumentos (arquivos) possíveis para o rm sem causar estouro de pilha.

[6] Comentário enviado por rafagavioes em 12/03/2009 - 21:14h

[*****]!! sempre quis saber disso!!
valeu

[7] Comentário enviado por sneves em 08/07/2009 - 10:38h

Muito útil.
Funcionou perfeitamente.

Obrigado.
[]s

[8] Comentário enviado por W4rl0ck em 21/01/2010 - 20:00h

Excelente me ajudou muito hoje...
Grato

[9] Comentário enviado por volcom em 12/05/2010 - 10:46h

Perfect!

Mas usei pra outro comando:

for dir in /var/virtualmail/* ;do du -h -s $dir; done > /tmp/quotalista.txt

Listei o tamanho total dos diretórios e salvei em um arquivo para uso em um script.

Assim vamos seguindo hehehe

[10] Comentário enviado por allan_victor em 23/02/2012 - 13:00h

entre no diretório e execute o seguinte comando
ls | xargs -n1 rm -R

[11] Comentário enviado por removido em 13/02/2014 - 09:21h

Colegas,
Encontrei esta dica:

cd /home/minhapasta

sudo find -name '*.tmp' -delete

Apaga todos os arquivos com extensão tmp que estejam na pasta e nas sub-pastas.

Abraços :)

[12] Comentário enviado por frikasoide em 13/02/2014 - 10:35h

Bacana marmota38.
Você chegou a testar esse comando com mais de 1000 arquivos existentes?

O erro "Argument list too long" acontece em "sistemas UNIX, onda há um limite fixo de memória reservado para o ambiente e lista de parâmetros de um comando". Por isso este erro acontece geralmente com o "rm -rf *" em um diretório com muitos arquivos, o que gerará uma lista de parâmetros grande o suficiente para estourar a reserva de memória.

Abraço.

[13] Comentário enviado por Naldo_Unix em 19/03/2014 - 21:14h

Pessoal, no meu caso eu quero remover varios arquivos do mes de janeiro, como ficaria?

[14] Comentário enviado por felipetomm em 16/03/2015 - 00:33h

Alguem sempre surge com uma luz no fim do túnel.

Valeu Luiz!

[15] Comentário enviado por alelima77 em 11/04/2020 - 16:27h

Me ajudou bastante, pois estava com uma quantidade imensa de arquivos no meu /tmp, consumindo muito inode no raiz, e na remoção normal de diretórios dentro do tmp estava retornando:
bash: /bin/rm: Argument list too long

# find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
1 /tmp/adcli-krb5-0ZxRkc
1 /tmp/adcli-krb5-0ZxRkc/krb5.d
1 /tmp/adcli-krb5-0zXsNM
1 /tmp/adcli-krb5-0zXsNM/krb5.d
1 /tmp/adcli-krb5-0zXuz2
1 /tmp/adcli-krb5-0zXuz2/krb5.d
1 /tmp/adcli-krb5-0zy4Ns
1 /tmp/adcli-krb5-0zy4Ns/krb5.d
1 /tmp/adcli-krb5-0ZyTCG
1 /tmp/adcli-krb5-0ZyTCG/krb5.d
...

# for a in adcli*; do rm -rf $a; done



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts