viernes, 13 de mayo de 2016

Una vuelta al patio de juegos

Es hora de usar find de forma (casi) práctica. Crearemos un patio de juegos y probaremos algo de lo que hemos aprendido.

Primero, creemos un patio de juegos con muchos subdirectorios y archivos:

[me@linuxbox ~]$ mkdir -p playground/dir-{001..100}
[me@linuxbox ~]$ touch playground/dir-{001..100}/file-{A..Z}

¡Maravíllense con el poder de la línea de comandos! Con estas dos líneas, hemos creado un directorio patio de juegos que contiene 100 subdirectorios, cada uno conteniendo 26 archivos vacíos. ¡Inténtalo con la GUI!

El método que hemos empleado para realizar esta magia incluye un comando familiar (mkdir), una exótica expansión de shell (llaves) y un nuevo comando, touch. Combinando mkdir con la opción -p (que hace que mkdir cree los directorios padres de las rutas especificadas) con la expansión con llaves, podemos crear 100 subdirectorios.

El comando touch se usa normalmente para establecer o actualizar la fecha de acceso, la fecha de creación y la fecha de modificación de los archivos. Sin embargo, si el argumento del nombre de archivo es el de un archivo que no existe, se crea un archivo vacío.

En nuestro patio de juegos, hemos creado 100 instancias de un archivo llamado file-A. Encontrémoslas:

[me@linuxbox ~]$ find playground -type f -name 'file-A'

Fijate que al contrario que ls, find no produce resultados ordenados. Su orden lo determina el dispositivo de almacenamiento. Podemos confirmar que realmente tenemos 100 instancias del archivo de esta forma:

[me@linuxbox ~]$ find playground -type f -name 'file-A' | wc -l
100

A continuación, veamos los archivos encontrados basándonos en su hora de modificación. Ésto será útil cuando creamos copias de seguridad u organizamos archivos en orden cronológico. Para hacerlo, primero crearemos un archivo de referencia contra el que compararemos la hora de modificación:

[me@linuxbox ~]$ touch playground/timestamp

Esto crea un archivo vacío llamado timestamp y establece su hora de modificación en la hora actual. Podemos verificarlo usando otro comando útil, stat, que es un tipo de versión vitaminada de ls. El comando stat revela todo lo que el sistema entiende sobre un archivo y sus atributos:

[me@linuxbox ~]$ stat playground/timestamp
File: `playground/timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:15:39.000000000 -0400
Modify: 2008-10-08 15:15:39.000000000 -0400
Change: 2008-10-08 15:15:39.000000000 -0400

Si “tocamos” el archivo de nuevo y luego lo examinamos con stat, veremos que las horas del archivo se han actualizado:

[me@linuxbox ~]$ touch playground/timestamp
[me@linuxbox ~]$ stat playground/timestamp
File: `playground/timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:23:33.000000000 -0400
Modify: 2008-10-08 15:23:33.000000000 -0400
Change: 2008-10-08 15:23:33.000000000 -0400

A continuación, usemos find para actualizar algunos archivos de nuestro patio de juegos:

[me@linuxbox ~]$ find playground -type f -name 'file-B' -exec touch '{}' ';'

Esto actualiza todos los archivos del patio de juegos llamados file-B. Luego usaremos find para identificar los archivos actualizados comparando todos los archivos con el archivo de referencia timestamp:

[me@linuxbox ~]$ find playground -type f -newer playground/timestamp

El resultado contiene las 100 instancias del archivo file-B. Como realizamos un touch en todos los archivos del patio de juegos llamados file-B, después de actualizar timestamp, ahora son más “nuevos” que timestamp y por lo tanto pueden ser identificados con el test -newer.

Finalmente, volvamos al test de malos permisos que realizamos anteriormente y apliquémoslo a playground:

[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 \) -or \(-type d -not -perm 0700 \)

Este comando lista los 100 directorios y los 2600 archivos de playground (así como timestamp y el propio playground, haciendo un total de 2702) porque ninguno de ellos entra en nuestra definición de “buenos permisos”. Con nuestro conocimiento de los operadores y las acciones, podemos añadir acciones a este comando para aplicar nuevos permisos a los archivos y directorios en nuestro patio de juegos:

[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';' \)

En el día a día, podríamos encontrar más fácil manejarnos con dos comandos, uno para los directorios y otro para los archivos, en lugar de este gran comando complejo, pero es bueno saber que podemos hacerlo de esta forma. Lo importante aquí es entender cómo pueden usarse los operadores y las acciones juntos para realizar tareas útiles.

No hay comentarios:

Publicar un comentario