-bash / bin / rm Argumentlijst te lang - Oplossing

  • Giles Benson
  • 0
  • 579
  • 111
>

Symptomen

Dit foutbericht verschijnt wanneer u een lange lijst met bestanden probeert te verwijderen, verplaatsen of kopiëren. Als je je shell gebruikt, kan een commando maar een beperkt aantal argumenten accepteren. Als het aantal argumenten dat aan de opdracht wordt geleverd het toegestane aantal argumenten overschrijdt, verschijnt er een foutmelding:
 -bash: / bin / rm: Argumentenlijst te lang 
# getconf ARG_MAX 2097152 Voorbeeld:
 # rm * -bash: / bin / rm: Argumentenlijst te lang 

Oplossing

Er zijn een aantal oplossingen voor dit probleem. Ten eerste, als er geen bestanden zijn in een map die we willen behouden, is de beste en snelste oplossing om simpelweg de hele map te verwijderen en opnieuw te maken. Voordat u verder gaat, moet u ervoor zorgen dat de map geen bestanden bevat die u wilt behouden en dat u een notitie maakt met betrekking tot de machtigingen en het eigendom van deze map.
 $ cd… / $ ls -d mijndirectory $ rm -fr mijndirectory $ mkdir mijndirectory 
De andere oplossing is om een ​​for-lus in te schakelen en alle bestanden één voor één te verwijderen:
 $ voor ik in *; rm "$ i"; gedaan 
of veel sneller door gebruik van printf en xargs:
 $ printf '% s__g5_token5fa834afdbd41' * | xargs -0 rm 
of
 $ time echo -n * | tr "__ g5_token5fa834afdbd42 '| xargs -0 rm 
De bovenstaande oplossing heeft echter zijn eigen beperking, omdat het ook bestanden kan verwijderen die we zouden willen behouden als er geen juiste reguliere expressie aanwezig is. Als voorbeeld hier zullen we alleen verwijderen *.tekst bestanden:
 $ voor i in * .txt; doe rm "$ i"; gedaan 
De laatste en voorgestelde oplossing is om regex te gebruiken om alle bestanden in kleinere batches te splitsen. Zoek een soortgelijk patroon in alle bestanden en verdeel ze in kleinere groepen. Verwijder, kopieer of verplaats bijvoorbeeld eerst alle bestanden die beginnen met een en hebben extensie tekst, daarna alle bestanden die beginnen met b enzovoorts.:
 $ rm a * .txt $ rm b * .txt 
Je kunt het bovenstaande ook voor alle letters doen met een for-lus:
 $ voor i in $ (echo a… z); doe rm $ i * .txt; gedaan 



Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem