tl; dr
É uma limitação do kernel no tamanho do argumento da linha de comando. Use um forloop em seu lugar.
Origem do problema
Este é um problema do sistema, relacionado execvee ARG_MAXconstante. Há muita documentação sobre isso (veja man execve , wiki do debian ).
Basicamente, a expansão produz um comando (com seus parâmetros) que excede o ARG_MAXlimite. No kernel 2.6.23, o limite foi definido em 128 kB. Essa constante foi aumentada e você pode obter seu valor executando:
getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic
Solução: Usando forLoop
Use um forloop conforme recomendado no BashFAQ / 095 e não há limite, exceto para RAM / espaço de memória:
Execução a seco para verificar se ele excluirá o que você espera:
for f in *.pdf; do echo rm "$f"; done
E execute:
for f in *.pdf; do rm "$f"; done
Além disso, esta é uma abordagem portátil, pois a glob possui um comportamento forte e consistente entre os shells ( parte das especificações do POSIX ).
Nota: Como observado por vários comentários, isso é realmente mais lento, mas mais sustentável, pois pode adaptar cenários mais complexos, por exemplo , onde se deseja fazer mais do que apenas uma ação.
Solução: Usando find
Se você insiste, pode usar, findmas realmente não usa xargs , pois "é perigoso (quebrado, explorável etc.) ao ler entradas não delimitadas por NUL" :
find . -maxdepth 1 -name '*.pdf' -delete
Usar em -maxdepth 1 ... -deletevez de -exec rm {} +permite findsimplesmente executar as chamadas necessárias do sistema sem usar um processo externo, portanto, mais rápido (graças ao comentário do @chepner ).
Referências