viernes, 6 de mayo de 2016

Acciones predefinidas

¡Trabajemos! Tener una lista de resultados de nuestro comando find es útil, pero lo que realmente queremos hacer es actuar en los elementos de la lista. Afortunadamente, find permite que las acciones se realicen basándose en los resultados de búsqueda. Hay una serie de acciones predefinidas y varias formas de aplicar acciones definidas por el usuario. Primero, veamos algunas acciones predefinidas:

Tabla 17-6: Acciones predefinidas de find
Acción
Descripción
-delete Borra el archivo buscado.
-ls Realiza el equivalente a ls -dils en el archivo buscado. La salida se envía a la salida estándar.
-print Envía la ruta completa del archivo buscado a la salida estándar. Es la acción por defecto si no se especifica ninguna otra acción.
-quit Sale una vez que una búsqueda se ha realizado.

Como con los tests, hay muchas más acciones. Mira la man page de find para más detalles.

En nuestro primer ejemplo, hicimos esto:

find ~

que produjo una lista de cada archivo y subdirectorio contenidos en nuestro directorio home. Produjo una lista porque la acción -print está implícita si no se especifica ninguna otra acción. Por lo tanto, nuestro comando podría expresarse así también:

find ~ -print

Podemos usar find para borrar archivos que cumplan ciertos criterios. Por ejemplo, para borrar archivos que tengan la extensión “.BAK” (que a menudo se usa para designar archivos de copia de seguridad), podríamos usar este comando:

find ~ -type f -name '*.BAK' -delete

En este ejemplo, cada archivo en el directorio home del usuario (y sus subdirectorios) es buscado por si su nombre termina en .BAK. Cuando se encuentran, se borran.

Atención: No debería seguir sin decir que tengas extremo cuidado cuando uses la acción -delete. Siempre prueba antes el comando sustituyendo la acción -print por -delete para confirmar los resultados de búsqueda.

Antes de continuar, echemos otro vistazo a cómo afectan a las acciones los operadores lógicos. Considera el siguiente comando:

find ~ -type f -name '*.BAK' -print

Como hemos visto, este comando buscará todos los archivos normales (-type f) cuyos nombres terminan en .BAK (-name '*.BAK') y enviará la ruta relativa de cada archivo coincidente a la salida estándar (-print). Sin embargo, la razón de que el comando funcione de la manera que lo hace viene determinada por la relación lógica entre cada test y su acción. Recuerda que, por defecto, hay una relación -and implícita entre cada test y cada acción. Podríamos expresar también el comando de esta forma para hacer la relación lógica más fácil de ver:

find ~ -type f -and -name '*.BAK' -and -print

Con nuestro comando expresado completamente, veamos cómo afectan los operadores lógicos a su ejecución:

Test/Acción
Se ejecuta sólo si...
-print -type f-name '*.BAK' son verdaderos
-name ‘*.BAK’ -type f es verdadero
-type f Se ejecuta siempre, ya que es el primer test/acción en una relación -and.

Como la relación lógica entre los tests y las acciones determina cuales de ellos se ejecutan, podemos ver que el orden de los test y acciones es importante. Por ejemplo, si fuéramos a reordenar los test y las acciones para que la acción -print fuera la primera, el comando se comportaría de forma muy diferente:

find ~ -print -and -type f -and -name '*.BAK'

Esta versión del comando imprimirá cada archivo (la acción -print siempre se evalúa como verdadera) y luego busca por tipo de archivo y la extensión de archivo especificada.

No hay comentarios:

Publicar un comentario