Translation(s): English - Italiano

(!) ?Discussion


Di seguito è riportato un elenco di utilità a riga di comando che sono spesso dimenticate. Ci sono molte situazioni in cui si possono usare per semplificare attività noiose.

Elenco dei comandi

Segue l'elenco in ordine alfabetico:

aumix

for a in `seq 1 100`; do sleep 1; aumix -v-1; done; poweroff

Abbassa lentamente il volume della scheda audio nell'arco di 100 secondi, quindi spegne il sistema.

awk

Awk è un linguaggio di scripting completo con lo scopo di aiutare a processare del testo come in una pipeline di shell UNIX (dove alcuni comandi generano dati, magari filtrati usando dei programmi), e quindi mandare il risultato ad awk o ad uno script tramite pipe, per generare rapporti o riassunti, ecc. Si noti che come impostazione predefinita awk suddivide il testo in colonne, utilizzando gli spazi per separarle, e pone il campo di ogni colonna in una variabile denominata $1 (per il primo campo), $2 per il secondo, la decima colonna è $10, l'undicesima $11, e così via. Già questo, per esempio, rende più veloce la creazione di semplici filtri utilizzando awk rispetto a Perl eliminando la necessità di fare la suddivisione in spazi, immettere i dati in una matrice o un elenco di variabili, ecc. Ecco un esempio che mostra come usare awk per prendere un elenco di valori separati da virgola, 1) rimuovere le virgole, 2) usare awk per selezionare righe e colonne di dati in cui eseguire un calcolo arbitrario, e 3) utilizzare sed per rimuovere la prima riga, che può essere un valore non importante (giusto per mostrare l'utilizzo di sed).

... | sed 's/,//g' | awk 'BEGIN { oldval = 0 } ($1 ~ /^data:/ && $2 < 1024) { val = $4 - $3; sum += $6; print (val - oldval) / 2, val, $4, $5; oldval = val } END { print $sum }' | sed '1d' | more

basename

Un programma molto semplice (non incorporato nella shell ma un'utilità fornita dal pacchetto "coreutils"), che, data una stringa (percorso di un file nel filesystem) come argomento, restituisce solo il nome del file. In altre parole, rimuove tutti i livelli di directory, lasciando solo il nome del file. Dove si usa? È utile, per esempio, per la creazione di un ciclo in uno script di shell, o per rinominare file utilizzando alcuni schemi complessi ed operare su un elenco di percorsi. Questo strumento consente di estrarre solo l'effettivo nome del file, modificarlo in qualche modo, e poi ricombinare il nuovo nome con il percorso originale, utilizzando "dirname" (citato più avanti, anch'esso dal pacchetto "coreutils".)

Ecco un esempio (converte tutti i file FLAC presenti in una directory specifica, in MP3 in /tmp) che presuppone si stia usando Bash (o simili).

for file in /path/to/flac/music/files/*.flac; do filename=$(basename "$file"); newname=${file//.flac/.mp3}; flac -dc "$file" | lame - - > /tmp/$newname; done

comm

Uno strumento semplice ma potente: dati due file di testo i cui contenuti sono ordinati (per esempio, utilizzando sort e uniq), elenca il contenuto di entrambi organizzato in tre colonne: la prima colonna (senza rientro) mostra le righe trovate solo nel primo file, la seconda colonna indica quelle del secondo file, e la terza colonna le righe comuni ad entrambi. È possibile eliminare una qualsiasi delle colonne desiderate, ad esempio:

Questa utilità permette di gestire facilmente elenchi di oggetti.

dirname

Un altro semplice programma in dotazione nel pacchetto "coreutils". Simile per natura a "basename", estrae la gerarchia delle directory da un percorso. Utile in collaborazione con "basename", all'interno di script di shell, in un semplice ciclo al prompt, e così via. Può essere usato per manipolare e modificare nomi di file e directory, per esempio quando si convertono file FLAC in MP3.

dd

dd if=/dev/fd0 of=floppy-backup.img

Esegue il backup di un disco floppy in un file chiamato floppy-backup.img.

fdupes

Un bel modo per sbarazzarsi dei doppioni di file.

feh

Un leggero visualizzatore di immagini.

feh -l *.jpg

file

File indica quali tipi di file sono quelli elencati sulla riga di comando.

file -s /dev/hd*
file -i *

filtri

Molto divertente è il pacchetto filters che fa cose insolite :)

Una funzionalità molto potente supportata da quasi tutte le shell UNIX è la pipe. Consente di filtrare l'output dei comandi con grande flessibilità. Qui alcuni esempi in cui è possibile filtrare lo STDOUT di un comando (utilizzando una pipe non mostrata):

find

Find (fornito dal pacchetto findutils) è un vero e proprio coltellino svizzero per cercare file e directory. Una delle caratteristiche più potenti sono i criteri di ricerca incluse cose come dimensione del file, proprietari di file o directory e così via. Si possono quindi eseguire varie operazioni sui risultati. Consultare la pagina di manuale per i dettagli (man find). Alcuni esempi:

Cerca attraverso tutti i file (sui quali l'utente ha accesso in lettura) superiori ad un megabyte di dimensione, inviando l'output a sort che ordinerà l'elenco numericamente in base al settimo campo (delimitato da spazi bianchi).

find /usr/src -type f -size +1024k -ls | sort -r -n -b -k 7

Rimuove tutti i file core che si trovano in /tmp/ (stampando a video ciascun file core trovato). Si noti l'utilizzo di due parentesi graffe per indicare dove sostituire il nome del file trovato (e il percorso), e la necessità di una protezione con escape del punto e virgola alla fine del comando -exec:

find /tmp -type f -name core -exec rm -f {} \; -print

grep

Anche grep è un programma molto utile, mostra quali file contengono la stringa o espressione regolare specificata. Con l'aggiunta dell'opzione -E si possono usare espressioni regolari speciali come [[:space:]] per specificare uno spazio bianco (tabulazione o spazio), [[:digit:]] per corrispondenze su numeri, e su caratteri e numeri con [[:alnum:]] (alfa-numerico). In questo modo, sono possibili ricerche simili a:

grep -iE '^[[:space:]]*testo_da_cercare[[:space:]]+[[:digit:]]+' file_in_cui_cercare

È anche utile per cercare ricorsivamente in questo modo (notare che si dice a grep di mostrare solo le righe che non corrispondono e quindi calcolare il numero di righe trovate):

grep -iErv '^[[:space:]]*#' /usr/src/linux | wc -l

A volte si può trovare utile usare cat su una serie di file di testo per leggerne il contenuto, ma si desidera che le righe vengano precedute dal nome del file. Si può utilizzare grep fornendo una stringa vuota di ricerca, in questo modo:

grep '' un/percorso/ad/un/mucchio/di/semplici/file/*

imagemagick

Imagemagick è una raccolta di strumenti a riga di comando in grado di effettuare svariate manipolazioni sulle immagini.

Per convertire file .jpg in .png:

for i in *jpg;do convert $i ${i%jpg}png;done

lame

xmp --stereo -f 44100 -b 16 -d file -o - the.xm | lame -x -r -s 44.1 --bithwidth 16 -m s - the.mp3

links2

links2 -dump www.debian.org

lshw

Mostra informazioni dettagliate sulla configurazione hardware.

perl

L'interprete perl (e il suo linguaggio) (fornito dal pacchetto perl-base) può essere sfruttato per eseguire ottimi lavori sulla riga di comando. Ad esempio si può utilizzare un cosiddetto Perl "one-liner" (una singola riga di comando) per sfruttare la potenza delle espressioni regolari Perl e filtrare l'output di qualcosa. Per esempio:

perl -ne 's/pippo/pluto/g; print' < file_di_origine > file_modificato

Questo comando userà la shell per inserire il contenuto di file_di_origine nello STDIN di Perl, che eseguirà il comando fornito, eseguendo una ricerca e sostituzione di tutte le istanze di "pippo" con "pluto", ponendo le righe modificate in file_modificato. (Notare che per l'invocazione Perl si poteva usare cat per passare l'output del file su una pipe, ma si evitato quell'inutile invocazione di cat chiedendo alla shell di eseguire tale compito).

Ecco un comando che permette di cambiare i nomi di alcuni file MP3 dopo che sono già stati estratti:

perl -e 'opendir(DIR, ".") || die "error: could not open current directory: $!\n"; @files = grep(!/^\.+/, readdir(DIR)); foreach $file (@files) { @elems = split(/\s+-\s+/, $file); $new = $elems[2] . " - " . $elems[0] . " - " . $elems[3]; `mv "$file" "$new"`; }'

Il comando può sembrare complesso e si potrebbe certamente inserirlo in un file di testo per renderlo uno script Perl, ma dimostra come è possibile sviluppare rapidamente del codice Perl per risolvere un problema. Processa tutti i file presenti in una directory (ad esclusione di "." e "..") e divide i nomi in campi basandosi sui trattini per poi riordinare i campi, infine esegue mv per rinominarli dopo che il nuovo nome è stato creato.

nc

Netcat (o nc) è un bel programma che può trasferire stdin e stdout attraverso una connessione di rete TCP o UDP. Può aprire connessioni sia lato server server che client. Per esempio:

nc -l -p 10000 # Apre una connessione in ascolto (server)
nc 127.0.0.1 10000 # Si connette a 127.0.0.1:10000

Client http casalingo:

echo -ne "GET / HTTP/1.1\r\nHost:www.debian.org\r\n\r\n" | nc www.debian.org 80 | sed -e "1,/^\r$/ d" > la_pagina.html

sed è usato per togliere l'intestazione HTTP. Si noti che nc non chiuderà mai la connessione, a meno che non si specifichi un timeout con l'opzione -w.

randomize-lines

randomize-lines (rl) è uno strumento a riga di comando che legge righe da un file input o stdin e le mette in ordine casuale.

Il risultato della ricerca effettuata con find viene passato a madplay che riprodurrà i brani in modo casuale.

madplay `find music -type f -name "*.mp3" | rl`

rename

Rename è uno script perl che può cambiare i nomi dei file utilizzando espressioni regolari. Fa parte del pacchetto perl. Per esempio per rinominare tutti i file con estensione .c in .cpp si può digitare:

rename s/.c$/.cpp/ *.c

rsync

Copia file da e verso computer remoti. Rsync è in grado di accelerare notevolmente i trasferimenti quando alcuni dei file di destinazione esistono già.

screen

EDITOR="emacs -nw" crontab -e
@reboot /usr/bin/screen -dmS irc irssi -c irc.gnu.org

setmixer

?setmixer è uno strumento non interattivo per la lettura o l'impostazione dei livelli del volume del ?mixer.

Symlinks esamina delle directory alla ricerca di link simbolici e li elenca sullo standard output. Ogni link è preceduto da un qualificatore che indica se è relativo, assoluto, interrotto, ingarbugliato, troppo lungo o se punta ad un altro file system.

telnet

Telnet è un client per protocolli internet basati su testo (come HTTP, POP3 e molti altri). Vedere anche ssh.

unison

Come rsync, ma consente aggiornamenti bidirezionali. Utile per mantenere diverse copie degli stessi file su molte macchine.