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ångDu ä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.
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 -deleteDetta:
- 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 \) -deleteTa bort filer som matchar ett mönster (säkert)
I stället för:
rm *.loganvända:
hitta . -maxdjup 1 -namn '*.log' -deleteDetta 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 -printOm 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.
