Buscar en este blog

domingo, 21 de septiembre de 2008

LINUX. buscar ficheros

Hay varios comandos que desde consola nos ayudan a buscar ficheros:

locate busca rápidamente, ya que no va leyendo el disco, sino que mira en un indice que tiene en una base de datos: man locate

# Por ejemplo para buscar donde está el server.xml del tomcat
[user@locahost ~]$ locate server.xml
/usr/local/apache-tomcat-5.5.26/conf/server.xml

find es el comando para buscar, este si que va leyendo el disco. CUIDADO que es recursivo, por ello es mejor indicarle la ruta donde empezar a buscar.

# Por ejemplo para buscar los java compilados
[user@locahost ~]$ find programas/ -name *class

Lo mejor es juntar el comando find con el comando grep ó egrep o fgrep
y así buscamos dentro del contenido del los ficheros
# Buscamos los ficheros con extensión java que tengan el texto jdbc:mysql
[user@locahost ~]$ find programas/ -type f -name *.java -print | xargs egrep -i "jdbc:mysql"

Un mini-how to sobre comandos para buscar en linux lo teneis en
espaciolinux.com

Ahora estoy intentando buscar todos los ficheros que hayan cambiado los últimos 18 días y que se copien al dir backup. A ver cómo consigo que también me cree el directorio de cada fichero ???
# Buscar en el dir programas los ficheros que no sean ocultos, ! -name '.*', que hayan sido modificados desde hace 18 días hasta ahora y que los copie al dir backup
[user@locahost ~]$ find programas/ ! -name '.*' -type f -mtime -18 -exec cp -p {} backup/ \;

Ya he conseguido las opciones del comando para indicar bien el criterio de tiempo o fecha del archivo, revisar el "man find" es fundamental. En cambio el tema de que vaya creando los directorios lo he omitido porque con el comando rsync me actualizaría los directorios y ficheros sin complicarme con tantos parametros "rsync -av origen destino", a ver si tengo tiempo de crear otra entrada sobre "rsync". Bueno a lo que vamos, "find":

Numeric arguments can be specified as

+n for greater than n,

-n for less than n,

n for exactly n.

-amin n
File was last accessed n minutes ago.

-anewer file
File was last accessed more recently than file was modified. If
file is a symbolic link and the -H option or the -L option is in
effect, the access time of the file it points to is always used.

-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.



El tema está en si era "-mtime +18" o "-mtime -18".
# Modificación anterior a 18 días
-mtime +18

# Modificación posterior a 18 dias
-mtime -18

Busco los ficheros que hayan sido modificados en estos últimos 18 días y los copio.

find datos/ -type f -mtime -18 -exec cp -p {} /mnt/dat/backup/ \;


Busco los ficheros con fecha de modificación anterior a estos últimos 7 días y los borro.

find datos/ -type f -mtime +7 -exec rm -f {} \;


Leyendo el manual de find "man find" hay opciones para ficheros accedidos, cambiados, modificados

-atime n
-ctime n
-mtime n

Para entender las fechas de los ficheros, ejecutar el comando stat.

stat fichero



Vuelvo a recordar que el comando find es recursivo, por lo que siempre hay que indicarle la ruta y tener cuidado cono que le ponemos al -exec para evitar sorpresas:


SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

No hay comentarios: