Monday, June 15, 2009

Reindirizzare al comando rm

Stamattina avevo bisogno di cancellare un file, un residuato bellico di winxp chiamato "desktop.ini". In effetti è un file minuscolo, quasi innocuo, ma da fastidio all'occhio (al mio ad esempio) e inoltre fa attrito con VLC, quando aggiungiamo delle cartelle intere alla riproduzione, poichè finisce in mezzo agli ingranaggi di VLC...soprattutto se questo dannato è presente ovunque, come il prezzemolo, per usare una metafora che non rende onore alla sua asfissiante ubiquità, in tutte le cartelle e sottocartelle relative. Quindi ho deciso che lo/li voglio togliere nello stile di un vero scripter bash. Mi sono accorto con immenso dispiacere che il comando rm non può ricevere tramite pipe o redirezione il nome dei file da cancellare. Ho fatto quindi un po' di ricerche con lente d'ingrandimento alla mano in giro per la Rete e ho potuto scoprire i pregi del comando xargs. Xargs è un comando che esegue un altro comando al quale fornisce i parametri di cui ha bisogno. La particolarità è che li fa sembrare (al comando che li riceve) come provenienti direttamente dallo standard input, formattandoli secondo le opzioni che a noi vanno meglio. Mi spiego meglio con un esempio: $ find | grep desktop.ini ./Pink Floyd/Echoes-CD 2/desktop.ini ./Pink Floyd/Echoes-CD 1/desktop.ini ./Musica mia/Echoes-CD 2/desktop.ini ./Musica mia/Echoes-CD 1/desktop.ini ./Musica mia/Woodstock/desktop.ini ./Musica mia/Woodstock/Woodstock- Music from the Original Soundtrack and More Disc 1/desktop.ini ./Musica mia/Woodstock/Woodstock- Music from the Original Soundtrack and More Disc 2/desktop.ini Tutti i percorsi che sono riportati qui, portano ai files che voglio cancellare. Come si vede nelle stringhe sono presenti spazi, caratteri speciali e anche caratteri invisibili come il newline. Alla fine di ogni linea è presente un carattere invisibile newline "\n". Il mio scopo è reindirizzare queste righe a rm (fare il redirect to rm) una alla volta. La soluzione al problema è questo comando: $ find | grep desktop.ini | xargs -d "\n" rm In questo modo si dice ad xargs di formattare le righe da dare da mangiare a rm, usando come terminatore (delimiter) il carattere \n.