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

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

[ Hits: 54.739 ]

 


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

Comando CLS do Windows no Linux

Instalar navegador Opera no Ubuntu 8.10

Vire "ninja" no Linux com curso grátis online

80 Comandos para o Linux (parte 1)

Expressão regular com o Wget

  

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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts