Differenze tra le versioni di "Shell Tricks"
Da MontelLUG WIKI.
(aggiunta avvertenza) |
(script conversione immagini) |
||
Riga 68: | Riga 68: | ||
[[Script per rinonimare file dalla macchina digitale 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. | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | Volendo evitare commenti e altre amenità superflue, basta digitare da linea di comando | ||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> |
Versione delle 23:16, 7 apr 2005
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
- 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).
- 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
- 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
- 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
- tail accetta anche +n come argomento, non solo -n! tail +n significa proprio dammi la coda del file dalla riga 10 in poi
- 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
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