Bucle sobre un conjunto de archivos desde el shell

Los scripts de shell son potentes porque cualquier cosa que se pueda hacer desde el shell se puede hacer en un script de shell. Del mismo modo, la funcionalidad que se ve generalmente solo en los scripts de shell como bucles y condicionales es un juego justo, que se escribe directamente en el shell. Recorrer un conjunto de archivos usando un bucle for es un ejemplo simple.


Si hay varios archivos gzip en un directorio y desea extraerlos en directorios separados, el bucle desde el shell es una solución. Por ejemplo, file1.tar.gzip y file2.tgz existen y se deben extraer en los directorios file1.tar.gzip.dir y file2.tgz.dir, respectivamente. Si usa un shell de tipo Bourne (sh, ksh, zsh, bash), use los siguientes comandos desde la línea de comandos. (Después de presionar Intro al final de cada línea, el shell cambiará el indicador a> para hacerle saber que aún está esperando más).

para archivo en * gz
> hacer
> mkdir $ file.dir
> (cd $ file.dir; gzip -dc $ file | tar xf -)
> hecho

La inclusión de los comandos cd y gzip / tar entre paréntesis hace que el cambio de directorio afecte solo a los comandos gzip / tar, no a los posteriores.

Otro ejemplo muestra cómo crear un archivo que consiste en el contenido de una serie de archivos (como los archivos de registro) ordenados por su última fecha de modificación. Para crear un archivo biglog compuesto de todos los archivos en el directorio actual ordenados por fecha, use lo siguiente:

para x en 'ls -tr * .log'
> hacer
> cat $ x >> biglog
> hecho

El comando ls -tr * .log enumera todos los archivos que terminan en .log en orden cronológico. Este comando se incluye entre "comillas especiales", no las "comillas simples habituales", lo que hace que el comando se ejecute y su salida se devuelva al shell para que se utilice como una variable. El archivo biglog debe estar vacío o eliminado antes de ejecutar estos comandos.