Loop su un set di file dalla shell

Gli script di shell sono potenti perché tutto ciò che può essere fatto dalla shell può essere fatto in uno script di shell. Allo stesso modo, la funzionalità vista solitamente solo in script di shell come loop e condizionali è un gioco leale, digitato direttamente nella shell. Fare un ciclo su un insieme di file usando un ciclo for è un semplice esempio.


Se ci sono diversi archivi gzip in una directory e vuoi estrarli in directory separate, il loop dalla shell è una soluzione. Ad esempio, file1.tar.gzip e file2.tgz esistono e devono essere estratti rispettivamente nelle directory file1.tar.gzip.dir e file2.tgz.dir. Se si utilizza una shell di tipo Bourne (sh, ksh, zsh, bash), utilizzare i seguenti comandi dalla riga di comando. (Dopo aver premuto invio alla fine di ogni riga, la shell cambierà il prompt in> per farti sapere che è ancora in attesa di più.):

per il file in * gz
> fare
> mkdir $ file.dir
> (cd $ file.dir; gzip -dc $ file | tar xf -)
> fatto

Includendo i comandi cd e gzip / tar tra parentesi, la modifica della directory influisce solo sui comandi gzip / tar, non su quelli successivi.

Un altro esempio mostra come creare un file composto da un numero di file (come i file di registro) ordinati in base alla data dell'ultima modifica. Per creare un file biglog composto da tutti i file nella directory corrente ordinati per data, utilizzare quanto segue:

per x in 'ls -tr * .log'
> fare
> cat $ x >> biglog
> fatto

Il comando ls -tr * .log elenca tutti i file che terminano in .log in ordine cronologico. Questo comando è racchiuso tra 'virgolette speciali', non le 'solite virgolette singole' che fa sì che il comando venga eseguito e il suo output restituito alla shell per l'uso come una variabile. Il file biglog deve essere vuoto o cancellato prima dell'esecuzione di questi comandi.