Azioni

Shell Tricks

Da MontelLUG WIKI.

Menu
MontelLUG frontpage
Aiuto: Come modificare le pagine
Torna indietro

Avvertenza

Gli script presentati in questa pagina sono assolutamente senza alcuna garanzia. Usarli a proprio rischi e pericolo.

Eliminazione file mp3 di tutti gli utenti :)

1. find /home -name '*.mp3' -print0 | xargs -0r rm -f 
2. find /home -iname '*.mp3' -exec rm {} \; 

Spiegazione

  1. Cerca nella cartella /home (e nelle sue sottodirectory) i file con estensione mp3 e stampali separati da carattere nullo (0x00) (quindi funziona anche con nomi con spazi). Passa il tutto a xargs che controlla che l'elenco, separato da caratteri nulli (-0), non sia vuoto (-r) e rimuove i file senza pieta' (-f), invocando una sola volta il comando rm (piu' veloce di un ciclo for o della seconda versione qui sotto).
  2. Cerca i file *.mp3 in modo case insensitive (-iname) e per ogni file trovato esegui il comando rm NOMEFILE (in quanto le parentesi graffe vengono sostituite con il nome del file trovato). Per rimuovere i file chiedendo prima conferma, basta aggiungere il parametro -i di rm, ovvero rm -i {} \;

Ricerca di testo in file

find /dir -type f -print0 | xargs -0r grep "stringa"

Spiegazione

Elenca tutti i file normali (non le directory, non i link simbolici, non i device...) nelle directory e /dir e nelle sue sottodirectory e li passa nel solito modo a xargs, che crea la stringa per il grep, una potente utility di ricerca. Il grep cercherà allora la stringa "stringa" nei file, restituendo la riga e il nomefile in cui si trovano.
Specificando il parametro -i del grep la ricerca sarà insensibile a maiuscole/minuscole.
Specificando il parametro -s il grep non restituisce messaggi di errore se non riesce a guardare qualche file perché non si hanno i permessi.

Creazione in automatico di directory


echo "for(c=0;c<10;++c){\"prova\";c}" | bc | xargs mkdir

Spiegazione

Il comando bc (e' nello standard posix) e' una potente calcolatrice programmabile. Se gli si butta qualcosa nello stdin lui restituisce gentilmente il risultato in stdout. Il ciclo for che gli passiamo crea semplicemente le stringhe prova1, prova2, ecc. separate da a capo.
Il mkdir crea quindi le directory.
Attenzione: cosi' com'e' non funziona con nomi che contengono spazi.

Selezione di righe da un file


1. sed -n '5,10p;10q' nomefile
2. head -10 nomefile | tail -5

Spiegazione

  1. Il sed e' un potente editor di flussi. Il comando qui sopra dice: -n fa solo quel che ti chiedo esplicitamente (altrimenti copia in output ogni riga che riceva in input); 5,10p butta in output le righe da 5 a 10; 10q alla decima riga esci senza leggere altro dal file
  2. leggi le prime 10 righe da nomefile, crea una pipe e passa tutto a tail, che tiene solo le ultime 5.

NOTE: la prima versione e' piu' efficiente perche' non crea pipe e legge le prime 10 righe solo una volta.

Scartare le prime righe da un file


1. tail +10 nomefile
2. sed -n '10,$p' nomefile

Spiegazione

  1. tail accetta anche +n come argomento, non solo -n! tail +n significa proprio dammi la coda del file dalla riga 10 in poi
  2. l'unica cosa nuova rispetto al comando sopra e' il segno $ che sta ad indicare l'ultima riga

Rinominare immagini con la data

Script per rinonimare file dalla macchina digitale con la data

Scalare immagini per la pubblicazione nel web

Si puo' utilizzare l'ottimo programma convert di ImageMagick per scalare, ruotare, convertire immagini fra diversi formati. Esempio tipico: dopo aver acquisito delle immagini da scanner o fotocamera, queste devono essere ruotate e scalate per la pubblicazione nel web, con larghezza di 600 pixel. Inoltre, si vogliono creare delle anteprime con larghezza di 100 pixel. Supponiamo che le immagini siano tutte dentro la directory corrente, e che le immagini e le anteprime per il web debbano essere scritte nella sottodirectory web. Lo script che segue e' reso molto piu' lungo a causa dei commenti e delle istruzioni di test che aiutano a seguire passo passo il procedimento svolto, che risultano utili solo come esercizio.

mkdir web ;# crea directory, se non esiste
for file in *.jpg; do 
  # file e' una variabile a cui viene associato il nome di ciascun file con estensione .jpg
  # presente nella directory corrente
  echo "Processo l'immagine $file..."  

  # In radice metto il nome del file senza l'estensione .jpg: ci servirà per 
  # attribuire un nome alle anteprime
  # echo stampa il nome del file e sed sostituisce ".jpg" in ""  
  radice=`echo $file |sed s/\.jpg$//g`
  # stampo il nome della radice
  echo "radice=$radice..."

  # Ruotiamo e scaliamo le immagini
  echo "Ruoto e ridimensione $file in web/$file..."
  convert -rotate 90 -sample 600 "$file" "web/$file"; done
  # Creiamo anteprime con larghezza di 100 pixel
  echo "Creo anteprima in web/$radice_small.jpg..."
  convert -sample 100 "web/$file" "web/$radice_small.jpg"
done

Volendo evitare commenti e altre amenità superflue, basta digitare da linea di comando

mkdir web; for file in *.jpg; do convert -rotate 90 -sample 600 "$file" "web/$file"; 
convert -sample 100 "$file" "web/`echo $file |sed s/\.jpg$//g`_small.jpg"; done

Script per il ripping automatico di un CD

Ripping automatico di un CD su un lettore MP3

Contare il numero di righe di codice di un progetto

Può essere utile o curioso sapere quante righe di codice sono state scritte per un determinato progetto software. Una semplice stringa di shell, et voilà:

 find . -name "*.[h,cpp]" -print0 | xargs -0 cat | grep -c 

Il comando così com'è va lanciato dalla cartella princiaple del progetto, opure si sostituisce il suo percorso al posto del punto dopo find. Il comando cerca tutti i file sorgente .h e .cpp (se usate linguaggi diversi dal C++, basta cambiare le estensioni), li passa ad xargs che li prende come argomenti di cat, il quale li unisce in un unico flusso, di cui poi grep conta il numero di righe (opzione -c). Gli apici in fondo servono a dire a grep di considerare tutte le righe e non filtrare l'output secondo un certa stringa.