tl; dr
Dies ist eine Kernelbeschränkung für die Größe des Befehlszeilenarguments. Verwenden Sie for
stattdessen eine Schleife.
Ursprung des Problems
Dies ist ein Systemproblem, das mit execve
und ARG_MAX
konstant ist. Es gibt eine Menge Dokumentation darüber (siehe man execve , Debians Wiki ).
Grundsätzlich erzeugt die Erweiterung einen Befehl (mit seinen Parametern), der den ARG_MAX
Grenzwert überschreitet. Auf dem Kernel 2.6.23
wurde das Limit auf gesetzt 128 kB
. Diese Konstante wurde erhöht und Sie können ihren Wert erhalten, indem Sie Folgendes ausführen:
getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic
Lösung: Verwenden von for
Loop
Verwenden Sie eine for
Schleife, wie sie in BashFAQ / 095 empfohlen wird, und es gibt keine Begrenzung außer für RAM / Speicherplatz:
Durch einen Trockenlauf wird sichergestellt, dass das, was Sie erwarten, gelöscht wird:
for f in *.pdf; do echo rm "$f"; done
Und führen Sie es aus:
for f in *.pdf; do rm "$f"; done
Dies ist auch ein portabler Ansatz, da Glob ein starkes und konsistentes Verhalten zwischen Shells aufweist ( Teil der POSIX-Spezifikation ).
Hinweis: Wie in mehreren Kommentaren erwähnt, ist dies zwar langsamer, aber wartbarer, da komplexere Szenarien angepasst werden können, z. B. wenn mehr als nur eine Aktion ausgeführt werden soll.
Lösung: Verwenden find
Wenn Sie darauf bestehen, können Sie xargs verwenden, find
aber wirklich nicht, da es "gefährlich (kaputt, ausnutzbar usw.) beim Lesen von nicht durch NUL getrennten Eingaben ist" :
find . -maxdepth 1 -name '*.pdf' -delete
Die Verwendung von -maxdepth 1 ... -delete
anstelle von -exec rm {} +
ermöglicht find
es, die erforderlichen Systemaufrufe einfach selbst auszuführen, ohne einen externen Prozess zu verwenden, und ist daher schneller (dank des Kommentars von @chepner ).
Verweise