moreutils: una collezione di utili strumenti da riga di comando

Moreutils contiene una raccolta di strumenti per gli utenti che usano la riga di comando. Scritto da molti autori, questi strumenti sono modesti e, forse, troppo limitati per esistere in un pacchetto autonomo, ma tutti insieme formano un utilissimo accompagnamento per tutti gli altri programmi da riga di comando.

Sponge - Ammorbidire i 'file redirect'

Molti utenti della riga di comando hanno sicuramente fatto un errore come il seguente:

$ grep -v someuser /etc/passwd > /etc/passwd

Appena il comando viene eseguito, questo cancellerà il file di destinazione per poi eseguire, in seguito, il comando 'grep'. Il risultato finale è un file vuoto - certamente diverso dal risultato aspettato! Dopo aver imparato dai propri errori, l'utente potrebbe effettuare il reindirizzamento dell'output verso un file temporaneo, per poi spostarlo al posto del file originale

$ grep -v someuser /etc/passwd > /etc/passwd.tmp
$ mv /etc/passwd.tmp /etc/passwd

Sponge è un semplice, ma utile, comando che esiste per ridurre questo processo in un solo passaggio:

$ grep -v someuser /etc/passwd | sponge /etc/passwd

Sponge 'assorbe' quanto passato dallo standard input, aspettando il completamento del primo processo prima di scrivere nel file specificato. In questo modo il risultato è quello atteso, e senza bisogno di appoggiarsi ad un file temporaneo .

Vipe - Modifica interattiva delle "pipe"

Qualche volta è desiderabile poter 'mettere mano' nel passaggio di parametri attraverso una 'pipe', dove è più veloce modificare il contenuto della 'pipe' piuttosto che creare filtri complessi con sed e simili. Forse il contenuto della pipe potrebbe essere sconosciuto, forse è una lista di file che l'utente vorrebbe filtrare manualmente.

Supponiamo che si voglia effettuare un 'touch' dei file contenuti nella directory corrente, ma lo si vuole fare selettivamente... per fare questo può essere usato il seguente comando:

$ ls | vipe | xargs -d '\n' touch

In questo esempio una lista di file verrà aperta nel proprio editor preferito (impostabile tramite le variabili di ambiente EDITOR o VISUAL), tramite il quale sarà possibile modificare la lista dei file da passare al comando touch. Una volta soddisfatti del, è sufficiente salvare il contenuto dell'editor ed uscire, vipe restituirà il contenuto modificato nel proprio standard-output - effettuando un 'touch' dei soli file indicati.

Combine - Operazioni Booleane con i file di testo

Effettuare delle operazioni con delle linee in due file di testo può essere molto utile. Questo può essere utile per sapere quali nomi di file sono presenti in due diverse directory, per esempio

La directory foo contiene i file tom e harry

La directory bar contiene i file tom e dick

La lista dei file può essere scritta in due file, pronti per essere usati con combine, tramite il seguente comando bash:

s /path/di/foo > foo_list && ls /path/di/bar > bar_list

Può essere complicato trovare quali file sono presenti in entrambe le directory:

$ combine foo_list and bar_list
tom

Cosa dire dei file che sono in foo ma non in bar?

$ combine foo_list not bar_list
harry

Una piccola nota a cui fare attenzione: mentre si usa combine, l'operatore 'or' può essere usato per ottenere una lista completa di file, ma ha l'effetto collaterale di riportare i file contenuti in entrambi gli elenchi due volte:

$ combine foo_list or bar_list
harry
tom
dick
tom

Per ottenere l'unione di due liste di file è meglio usare il comando sort:

$ cat foo_list bar_list | sort -u
dick
harry
tom

Sommario

Questa introduzione al pacchetto moreutils ha solo parlato di alcuni dei comandi che vengono forniti. Ecco una lista dei comandi forniti di cui non è stato parlato:

isutf8 controlla se il file è composto da caratteri utf-8 validi

ts riproduce lo standar input nello standard output con il timestamp come prefisso - utile per file di log non dotati di timestamp

vidir permette ad un utente di poter "modificare" una directory con il proprio editor di testi. Questo è utile per rinominare o cancellare file

ifdata restituisce le informazioni richieste relative ad una interfaccia senza dover effettuare il parsing dell'output di ifconfig

pee funziona come tee, ma effettua una pipe al comando dato

zrun riconosce automaticamente se un file passato è compresso, lo decomprime in un file temporaneo e passa quest'ultimo al posto del file originale

mispipe connette due programmi con una pipe, come in commando1 | commando2, ma restituisce il codice di uscita del primo comando, al posto del secondo

Moreutils è disponibile in Debian a partire da testing ed in Ubuntu a partire da edgy.

Link all'articolo ufficiale