tl; dr
É uma limitação do kernel no tamanho do argumento da linha de comando. Use um for
loop em seu lugar.
Origem do problema
Este é um problema do sistema, relacionado execve
e ARG_MAX
constante. 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_MAX
limite. 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 for
Loop
Use um for
loop 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, find
mas 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 ... -delete
vez de -exec rm {} +
permite find
simplesmente 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