Hoje tentei limpar uma pasta do servidor que tinha mais de 70 mil arquivos e ao rodar o comando
$ rm -rf /pasta/*
Acabei recebendo a mensagem “Argument list too long”, pesquisando um pouco encontrei a solução.
Quem imprimiu esse erro não foi o comando (o rm, no exemplo), mas a bash, que é responsável por expandir o wildcard *, substituindo-o pela lista de arquivos no diretório. Você pode descobrir o limite no seu sistema usando o comando getconf. Veja:
$ getconf ARG_MAX
Para remover essa quantidade de arquivos existem diversas saídas, variando a eficiência dependendo de qual é o seu comando. No exemplo a seguir utilizaremos o rm, mas poderia ser substituído por o cp, ou o mv.
$ find . -type f -exec rm -f {} \;
Nesse exemplo o find vai encontrar no diretório em que estou (.) todos os arquivos (-type f) e para cada um deles executar (-exec) o comando rm. As chaves {} são substituídas por cada arquivo encontrado pelo find. Dessa forma o rm é executado uma vez para cada arquivo, tendo assim apenas aquele arquivo como parâmetro, o que evita ultrapassar o limite de memória imposto. No final \; é para fechar o comando do -exec com um ponto e vírgula, que precisa ser precedido da contra barra (\) para que a bash não o interprete (uma vez que ; é um caractere com sentido especial para a bash) e apenas o passe para o find.
Caso, por exemplo, você precise remover somente os arquivos html e não os arquivos .php em um diretório, basta usar o find novamente:
$ find . -name \*.html -exec rm -f {} \;
Aqui o asterisco funciona porque está precedido pela contrabarra o que faz com que a bash não o interprete, apenas o find. E o find não expande o asterisco em todos os arquivos do diretório, como a bash. Para o find, o asterisco é parte de uma expressão regular, que quer dizer encontre arquivos cujo nome seja qualquer coisa seguida de um .html .
Referência/Crédito:
http://www.dicas-l.com.br/arquivo/bash_argument_list_too_long.php#.WbfM78iGOUk