bash: /bin/rm: Argument list too long
Volevo cancellare, su una macchina linux, una cartella piena di tanti piccoli file di log, e quando dico tanti, intendo TANTI !!!
ls -l |wc -l
570844
ma purtroppo rm, nonostante voglia cancellare solo una parte dei file mi dice picche:
rm 11*
bash: /bin/rm: Argument list too long
perchè i file che inizano per 11 (i file di log sono numerati) sono anch’essi troppi, tanti che il sistema nemmeno riecsce a contarli:
mail:/home/domains/Maildir/new# ls -l 11* |wc -l
bash: /bin/ls: Argument list too long
0
per fortuna la cosa è aggirabile:
find . -name ‘11*’ | xargs ls -l | wc -l
480047
e di conseguenza il comando
find . -name ‘11*’ | xargs rm
rimuove tutti i file che iniziano per 11 alleggerendo non poco la directory.
Notare per la cronaca che la directory incriminata stazione su una vetusta ma molto onorevole Debian Woody (all’epoca dell’instalalzione era la stabile) con kernel 2.4 su ext3.
io avrei fatto
for file in $(find cartella) ; do rm $file ; done
Ma in effetti quella soluzione e’ molto piu’ fica
Già, a me xargs piace troppo
beh si, funziona perforza così perchè rm in questo modo li vede uno per volta.
anche a me piace troppo xargs lo uso spessissimo
Io sono un pigro e mi sono fatto un piccolo script
#!/bin/bash
ELENCO=$(ls $1)
for file in $ELENCO
do
echo $1$file
rm $1$file
echo “cancellato”
done
Tutto bello identato e con l’echo di output ;D
Ma visto che ci sono imparerò a dominare meglio xargs perchè i comandi concatenati sono troppo fighi!
Davide con uno script del genere, con una mezza milionata di files come avevo, solo per mostrare l’output, ti ci sta’ una vita
uddiuuu una woody, pazzesco!
bellerrimo XARGS ti offre un disimpegno imediato da situazioni veramente imbarazzanti alle volte.
sarebbe andato bene anche un:
find . -type f -exec rm {} \;
Ciao
Il problema non è che i file sono troppi e il sistema non riesce a contarli. E` che la shell espande le wildcard prima di passarle al comando, quindi il tuo
rm 11*
diventa
rm 11123 11124 11125 11126… ecc. ecc.
Il limite della linea di comando mi pare siano 2 KByte, quindi se i file sono molti ti dà quell’errore.
find comunque, come dice Vito, è molto più potente di quello che pensi, non serve mettere in pipe xargs quasi mai. Negli esempi che hai riportato non serve mai.
Bye.
find -delete # oppure
find -delete -iname “11*” # oppure
find /home/domains/Maildir/new -delete #oppure
find /home/domains/Maildir/new -delete -iname “11*”
La sintassi di find è così bella e completa… perché complicarsi la vita?
bash: /bin/rm: Argument list too long…
Volevo cancellare, su una macchina linux, una cartella piena di tanti piccoli file di log, e quando dico tanti, intendo TANTI !!!
ls -l |wc -l
570844…
Scusa cosi per curiosita’:
perche’ questo comamdo funziona:
ls -l |wc -l
570844
mentre quest’altro:
ls -l 11* |wc -l
bash: /bin/ls: Argument list too long
invece da errore??
a regola con specificando “11*” la lista dei file dovrebbe essere meno lunga…