Come appare il messaggio
$ rm /var/spool/app/cache/*.tmp
-bash: /usr/bin/rm: Argument list too longCause frequenti
- Una directory contiene moltissimi file (cache, sessioni, coda di posta, upload) e il pattern li trova tutti.
- Il limite
ARG_MAXper argomenti più ambiente di una chiamata a un programma è superato. - Nomi di file molto lunghi fanno raggiungere il limite con meno file.
- Un ambiente molto grande (tante o grandi variabili) lascia meno spazio agli argomenti.
Verifica
- Qual è il limite su questo sistema?
getconf ARG_MAX - Quante voci ci sono nella directory? (ls -f non ordina, quindi è veloce)
ls -f /var/spool/app/cache | wc -l - Cosa troverebbe il pattern? Prima mostra, non cancellare ancora
find /var/spool/app/cache -maxdepth 1 -type f -name '*.tmp' -print | head -n 20 - Limite dello stack su cui si basa il limite degli argomenti
ulimit -s
Soluzione
- Fai risolvere il pattern a
findinvece che alla shell. Prima guarda il risultato con-print, poi cancella:find /var/spool/app/cache -maxdepth 1 -type f -name '*.tmp' -delete. Rimuove i file in modo definitivo. - Esegui un comando a blocchi:
find DIR -maxdepth 1 -type f -name '*.log' -exec gzip {} +. - Con xargs e nomi sicuri:
find DIR -maxdepth 1 -type f -name '*.jpg' -print0 | xargs -0 -n 500 mv -t /destinazione. - Restringi il pattern a una parte dei file, ad esempio
rm 2024-01-*, solo come ripiego. - Scopri perché si accumulano tanti file (job di pulizia, gestione sessioni, logrotate) e correggi quello.
Domande frequenti
Aumentare ulimit -s aiuta?
Può alzare il limite, ma è un ripiego. find -exec o xargs funzionano con qualsiasi numero di file.
Perché rm -rf sulla directory non è coinvolto?
Senza * la shell passa un solo nome. rm -rf DIR cancella l'intera directory, quindi usalo solo se vuoi davvero eliminare tutto.