miércoles, abril 28, 2010

Find, busqueda en UNIX, Linux, etc.

Normalmente utilizaremos el comando FIND.
Si hay que hacer algo con los ficheros encontrados podemos redirigir la salida a otro comando con pipe o pipeline.

En el siguiente ejemplo busca los ficheros que se hayan modificado hace más de 15 días y se los pasa como argumento al comando rm para que los elimine:


find /dir-ejemplo/otro-directorio –type f –mtime +15|xargs rm

-type f indica que lo que buscamos son ficheros "normales" (regular files).

En cuanto a mtime si ponemos una cantidad negativa (-15) buscaría los modificados hace menos que 15 días.


Para buscar ficheros con extensiones concretas:

La parte de las extensiones la he bajado del repositorio libre: http://www.dzone.com/snippets/find-files-certain-extensions

find ./ -regex ".*\(php\|html\|tpl\)$"

También se puede así: find ./ -iname "*.php" -or -iname "*.tpl" -or -iname "*.html"


Otras opciones:

A veces en lugar de mtime nos puede interesar más utilizar el ctime o atime:
ctime: cambio en el inodo. Cada vez que cambia el mtime cambia también el ctime. Pero además ctime cambia otras veces. Por ejemplo cuando cambia el propietario o algún permiso del fichero.
mtime: cambio en el fichero. Cambia cuando escribes en el fichero. Es la “edad” de los datos.
atime: access time es la última vez que se ha leído el fichero.
Puede ocurrir también que en lugar de buscar en días queremos buscar en minutos (los modificados hace menos de 15 minutos por ejemplo):

cmin, mmin, amin son los equivalentes en minutos de ctime, mtime y atime.


Continuando con opciones de find:


-name busca el patrón que pongamos a continuación.
Por ejemplo find / -name 'nombr?'

-iname es igual que name pero no distingue entre mayúsculas y minúsculas.
-depth procesa cada subdirectorio antes que el propio directorio.

-xdev indica que no se descienda por directorios de otros filesystems.
-delete CUIDADO. Borra ficheros. Aunque no lo pongamos -delete supone hacer -depth.

-path busca dentro de los directorios que cumplan el patrón:
Ejemplo: find . -path '*dbs*' -print
Junto con -path podemos usar la opción -prune y -o:
-prune (=limpiar). Se suele utilizar en combinación con -o que si no se cumple lo que hay a su izquierda (expresión 1), ejecuta lo que hay a su derecha (expresión 2).
Este ejemplo muestra el contenido de los directorios que no cumplen el patrón:
find . -path '*dbs*' -prune -o -print

Observación sobre -prune: 

Saludos.

No hay comentarios: