View my profile on LinkedIn

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.

11 Comments

  1. shark says:

    io avrei fatto
    for file in $(find cartella) ; do rm $file ; done

    Ma in effetti quella soluzione e’ molto piu’ fica :-)

  2. Già, a me xargs piace troppo :-)

  3. LuNa says:

    beh si, funziona perforza così perchè rm in questo modo li vede uno per volta.
    anche a me piace troppo xargs lo uso spessissimo ;)

  4. DvD says:

    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! :D

  5. Davide con uno script del genere, con una mezza milionata di files come avevo, solo per mostrare l’output, ti ci sta’ una vita :-)

  6. k76 says:

    uddiuuu una woody, pazzesco!

    bellerrimo XARGS ti offre un disimpegno imediato da situazioni veramente imbarazzanti alle volte.

  7. Vito says:

    sarebbe andato bene anche un:

    find . -type f -exec rm {} \;

    Ciao

  8. Alex says:

    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.

  9. Frafra says:

    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?

  10. diggita.it says:

    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…

  11. swarzy says:

    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…

Leave a Reply

hitstatus