Ubuntu

Hur man fixar "rm: Argumentlistan är för lång" i Bash

Om du någonsin har försökt ta bort ett stort antal filer med hjälp av:

rum *

och stötte på detta fel:

-bash: /usr/bin/rm: Argumentlistan är för lång

Du är inte ensam. Detta är ett vanligt Unix/Linux-problem, och det har ingenting att göra med rum sig själv. Den här artikeln förklarar varför det händer och hur man åtgärdar det på ett säkert sätt.

⚠️ Ansvarsfriskrivning

Alla kommandon som visas i den här artikeln tillhandahålls endast i utbildningssyfte. Du är fullt ansvarig för alla kommandon du utför på ditt system. Kommandon för filborttagning är destruktiva och oåterkalleliga. Dubbelkolla alltid sökvägarna och överväg att testa på icke-kritiska data först.

🤓😎 Fler och fler människor får våra tips om nördar, integritet, utveckling och livsstil

Vill du få de senaste bloggarna om nördar, integritet, utveckling och livsstil? Prenumerera på vårt nyhetsbrev.

Varför detta fel uppstår

När du springer:

rum *

de * expanderas av skalet, inte av rum. Bash ersätter jokertecknet med varje matchande filnamn innan kommandot körs.

Om det finns för många filer överskrider det expanderade kommandot systemets maximala argumentstorlek (ARG_MAX). När det händer går skalet sönder och rum springer aldrig.

Kort sagt: problemet är argumentutvidgning, inte filradering.

Fel väg (och varför den misslyckas)

rum *
  • Expanderar alla filnamn till ett enda kommando
  • Misslyckas när det finns för många filer
  • Kan inte ta bort kataloger utan -r

Rätt tillvägagångssätt: Använd hitta

Lösningen är att använda ett verktyg som bearbetar filer stegvis istället för att utöka allt på en gång.

Motsvarande av rum * (endast filer, inga kataloger)

hitta . -maxdjup 1 -typ f -delete

Detta:

  • Tar bara bort vanliga filer
  • Lämnar kataloger intakta
  • Undviker skalutvidgning helt

Motsvarande av rm -rf * (filer och kataloger)

hitta . -mindjup 1 -maxdjup 1 -exec rm -rf -- {} +

Detta kommando:

  • Tar bort alla filer och kataloger i den aktuella katalogen
  • Undviker gränser för argumentlistan
  • Hanterar säkert filnamn som börjar med -
  • Tar inte bort den aktuella katalogen i sig

Varning: Det här kommandot är mycket kraftfullt. Läs noggrant igenom det innan du kör det.

Inkludera symboliska länkar (närmare rum * Beteende)

hitta . -maxdjup 1 \( -typ f -o -typ l \) -delete

Ta bort filer som matchar ett mönster (säkert)

I stället för:

rm *.log

använda:

hitta . -maxdjup 1 -namn '*.log' -delete

Detta fungerar tillförlitligt även med miljontals matchande filer.

Förhandsgranska innan du tar bort

Innan du kör ett destruktivt kommando är det klokt att förhandsgranska vad som kommer att påverkas:

hitta . -mindepth 1 -maxdepth 1 -print

Om utdata ser korrekt ut, byt ut -skriva ut med -radera eller -exec rm.

Sammanfattning

  • Ta bort allt (filer + kataloger):
    hitta . -mindjup 1 -maxdjup 1 -exec rm -rf -- {} +
  • Ta bara bort filer:
    hitta . -maxdjup 1 -typ f -delete
  • Ta bort filer efter mönster:
    hitta . -maxdjup 1 -namn '*.log' -delete
  • Förhandsgranska innan borttagning:
    hitta . -mindepth 1 -maxdepth 1 -print

Sluttanke

Om du någonsin ser “"Argumentlistan är för lång"”, kom ihåg:

Skalet expanderade för mycket — byt till hitta.

Det är säkrare, mer skalbart och rätt verktyg för stora filoperationer.

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

sv_SESvenska
Bläddra till toppen