Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Resolvendo Problemas Comuns 5 - the Parameter List Is Too Long

Essa é raro, mas acontece

$ cd /meu/diretorio
$ rm *.dll
Error: The parameter list is too long


- O que? Eu não posso apagar todos os meus 3459834574935734957 arquivos?

Bom, primeiro vamos analisar o que aconteceu: a linha de comando ‘rm *.dll’ é expandida pelo shell corrente a ‘rm arquivo1.dll arquivo2.dll … arquivoN.dll’ e, nesse caso, esta lista de parâmetros foi demais pro probrezinho do rm.

Com o xargs é facil de resolver!
$ find /meu/diretorio -name '*.dll' -print | xargs rm


O que ele faz? o xargs recebe pela stdin toda uma lista de parâmetros que será entregue ao programa rm. Se esta lista extender o limite do sistema, então o xargs, inteligentemente, irá executar o rm uma vez, com a lista que for possível e, depois, executar de novo, até que todos os parâmetros sejam lidos. Aliás o xargs possui muitas opções interessantes, vale a pena dar uma estudada nele.

E assim todas as dll’s são apagadas – em definitivo, pois com rm ‘tr00’ não tem undelete ;-)

Comments

Tiago Peczenyj
Ah sim, quem limita/expande os coringas é o shell. Acho que escrevi uma frase ambígua – valeu!
eljunior
na verdade a lista de parâmetros não foi demais para o `rm’, quem limita isso é o próprio shell (tanto é que, num caso desses, nem um ls * funciona…). também não funcionaria somente `xargs rm’, se fosse limitação do `rm’; seria necessário limitar a quantidade de parâmetros com a opção -n pro `xargs’. ;-)

nas máquinas que usei, o limite do bash geralmente fora 32768 parâmetros…

falou!