Pular para o conteúdo

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

Dica publicada em Linux / Comandos
Luiz Henrique de Lima Siqueira frikasoide
Hits: 56.688 Categoria: Linux Subcategoria: Comandos
  • Indicar
  • Impressora
  • Denunciar

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.

Nenhuma dica encontrada.

Apontamento wireless

Suspendendo uma sessão do VIM

Abrindo o Konsole com o Konqueror, na pasta atual

Como acertar o relógio do Linux via console

Tratando arquivos de pacote

#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

Entre na sua conta para comentar.