A menos que seas una persona muy ordenada y tengas los archivos en tu equipo perfectamente clasificados, lo mas normal es que termines buscando. Si, probablemente, como comenté en el artÃculo sobre Catfish, un buscador gráfico para Ubuntu, una de las operaciones mas habituales que realizamos con nuestro equipo es buscar. En este artÃculo, vamos a hacer lo mismo que con Catfish, pero en el terminal. Es decir, vamos a buscar en el terminal.
Para buscar en el terminal utilizaremos find, y es precisamente a esta herramienta a la que vamos a dedicar este artÃculo. Por que, como veremos, no solo nos permite buscar con todo detalle cualquier archivo o directorio. También nos permite realizar acciones con lo que hemos encontrado. Esto, como veremos en el artÃculo, nos va abrir un abanico de posibilidades.
Si embargo, si eres de los que todavÃa no se atreven con el terminal, porque eres relativamente nuevo, o porque simplemente piensas que no es para ti, te recomiendo que pruebes Catfish.
Buscar en el terminal
find o como buscar en el terminal
find
es una herramienta disponible para el terminal con el podemos realizar búsquedas en uno o mas directorios de nuestro sistema de archivos. Estas búsquedas las podemos realizar siguiendo diferentes criterios establecidos por nosotros mismos. Y además, con los archivos o directorios encontrados podemos realizar acciones.
Existen diferentes criterios para buscar y localizar archivos y directorios. Desde patrones para buscar por el nombre, hasta rangos de fechas para buscar aquellos archivos que hemos modificado o accedido en el periodo indicado.
find en profundidad
El uso de find
es como sigue,
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [punto de inicio] [expresion]
El punto de inicio
se refiere a donde vamos a empezar a buscar. AsÃ, por ejemplo si queremos empezar a buscar el directorio en el que nos encontramos, ejecutaremos,
find .
Las opciones -H
, -L
y -P
son las que indicarán a find
como tratar con los enlaces simbólicos. En concreto,
-H
. Ignora los enlaces simbólicos, excepto aquellos definidos en los argumentos.-L
. Sigue los enlaces simbólicos.-P
. Ignora los enlaces simbólicos. Este es el comportamiento por defecto.
La opción -D
sirve para que find
nos informe de lo que sucede. Es útil, en particular para localizar algún problema con la ejecución de la función. AsÃ, tiene algunas opciones adicionales que nos pueden ayudar en esa investigación. Para ver todas las posibilidades, ejecuta find -D help
.
La opción -Olevel
habilita la optimización de nuestra consulta. De esta manera find
reordenará los filtros para acelerar el proceso preservando el funcionamiento esperado.
Condiciones
Las condiciones son todos aquellos requerimientos que debe cumplir un archivo o directorio para que esté dentro de lo que estamos buscando. No voy a citarlos todos, pero si aquellos mas interesantes (al menos para mi),
-name patron
selecciona aquellos archivos que cumplen con un determinadopatron
. La búsqueda distingue entre mayúsculas y minúsculas. Por supuesto el patrón admite los comodines*
,?
y[]
. Por ejemplo, si tenemos un directorio con los siguientes archivos,
Ejemplo01.txt Ejemplo02.txt Ejemplo03.txt
find . -name "Ejemplo*.txt"
nos devolverá todos los archivos.
find . -name "ejemplo*.txt"
no nos devolverá nada.
find . -name "Ejemplo0?.txt"
nos devolverá todos los archivos.
find . -name "Ejemplo0[1-2].txt"
nos devolverá los dos primeros archivos.
-iname patron
. Funciona exactamente igual que el anterior, pero es insensible a mayúsculas y minúsculas. Asà por ejemplo en el caso anterior,
find . -iname "ejemplo*.txt"
nos devolverá todos los archivos.
-path patron
. El funcionamiento es similar al dename
, pero para toda la ruta. No solo para el nombre del archivo o el directorio, sino en toda la ruta. Por ejemplo,
find /home/ -path "*/src/*"
Buscará todos los archivos en cuya ruta nos encontremos con /src/
.
-ipath patron
. Lo mismo que en el caso anterior, pero sin distinguir entre mayúsculas y minúsculas.-type X
. El tipo de elemento que estamos buscando. Asà para directorios-type d
, para archivos-type f
y para enlaces simbólicos-type l
. Existen mas tipos, pero estos son los que utilizo.-amin n
y-amin +n
. Archivos o directorios que tuvieron acceso hacen
minutos o al menos hacen
minutos.-atime n
y-atime +n
. Archivos o directorios que tuvieron acceso hacen
dÃas o al menos hacen
dÃas.-cmin n
y-cmin +n
. Archivos o directorios cuyo estado fue modificado hacen
minutos o al menos hacen
minutos.-ctime n
y-ctime +n
. Archivos o directorios cuyo estado fue modificado hacen
dÃas o al menos hacen
dÃas.-mmin n
y-mmin +n
. Archivos o directorios que fueron modificados hacen
minutos o al menos hacen
minutos.-mtime n
y-mtime +n
. Archivos o directorios que fueron modificados hacen
dÃas o al menos hacen
dÃas. Si utilizamos-
nos devolverá aquellos archivos o directorios modificados hace menos den
dÃas.
+n
busca valores mayor que n
-n
busca valores menor que n
n
busca exactamente el valor n
-perm XXX
. Archivos o directorios que tienen exactamente esos permisos.-perm -XXX
. Archivos o directorios que tienen al menos esos permisos.-perm /XXX
. Archivos o directorios que tienen alguno de esos permisos.-group nombre_del_grupo
. Archivos o directorios que pertenecen al gruponombre_del_grupo
.-user nombre_del_usuario
. Archivos o directorios que pertenecen al usuarionombre_del_usuario
.-executable
. Archivos que son ejecutables o directorios que son accesibles por el usuario.-readeable
. Archivos o directorios para los que el usuario tiene permiso de lectura.-writeable
. Archivos o directorios para los que el usuario tiene permiso de escritura.-size n[kMG]
o-size +n[kMG]
. Archivos que tienen exactamente un tamaño denk
KiB,nM
MiB onG
GiB. O en su segunda forma, que tienen al menos un tamaño de denk
KiB (1024 bytes),nM
MiB (1024*1024 bytes) onG
GiB (1024x1024x1024 bytes).-maxdepth n
limita la profundidad de la búsqueda an
niveles.
Acciones
Las acciones definen que es lo que vamos a hacer con los archivos que hemos encontrado según las condiciones establecidas.
-delete
. Borra los archivos.-exec orden {} \;
. Ejecuta la orden para cada uno de los archivos encontrados.-ls
. Lista con el formatols -dils
.-fls archivo
. Lo mismo que-ls
pero lo guarda en el archivo indicado.
Operadores
Nos permite concatenar condiciones,
! condicion
ó `not condicion. Niega la condición establecida.condicion1 condicion2
ócondicion1 -a condicion2
ócondicion1 -and condicion2
. Se deben cumplir ambas condiciones.- condicion1 -o condicion2
ó
condicion1 -or condicion2`. Se debe cumplir una de las dos condiciones.
Algunas recetas…
- Buscar en el terminal todos los archivos modificados en la última hora,
find /var/log/ -type f -mmin -60
- Buscar todos los archivos que tengan un tamaño de mas de 50MiB
find ~/Descargas/ -type f -size +50M
- Buscar en el terminal archivos que están en un rango determinado,
find ~/Descargas/ -type f -size +50M -size -100M
- Buscar y borrar todos los archivos que tengan un tamaño de mas de 50MiB
find ~/Descargas/ -type f -size +50M -delete
- Para encontrar archivos vacÃos
find /tmp -type f -empty
- Para encontrar directorios vacÃos,
find /tmp -type d -empty
- Para mover todos los archivos de mas de 1GiB a un directorio
archivos grandes
, pero te preguntará en cada ocasión si lo mueve o no, y en función de tu respuesta actuará,
find . -size +1G -ok mv '{}' ~/archivosgrandes \;
- Cambiar el permiso de todos los archivos,
find . -type f -exec chmod 664 {} \;
- Cambiar el permiso de todos los directorios,
find . -type d -exec chmod 775 {} \;
Conclusiones
find
de por si ya es una herramienta espectacular para simplemente buscar en el terminal. Pero si además la combinamos con la opción -exec
las posibilidades que te ofrece son espectaculares.
Te recomiendo que le des un vistazo, y le dediques algo de tiempo a comprenderla a fondo, porque te va a solucionar mas de un problema. Esta herramienta te permite simplificar las tareas sensiblemente.
Más información,
Me ha parecido un artÃculo muy útil, con tu permiso me lo voy a imprimir para tenerlo de referencia, en mis apuntes no se detalla tanto. Como siempre un trabajo excelente. Gracias.
Muchas gracias VÃctor. La verdad es que llevo algún tiempo persiguiendo escribir este artÃculo, porque últimamente estoy haciendo mucho uso de esta herramienta.
Gracias y un saludo.
Aquà van algunas recetas más…
find /-user 1000 (localiza todos los archivos del primer usuario normal)
find . -type f -perm 0777 -print (buscará en el directorio actual todos los ficheros con permiso 777)
find / -type f ! -perm 777 (buscará todos los ficheros que NO tengan el permiso 777)
find / -perm 2644 (busca todos los ficheros con el bit SGID con permiso 644)
find / -perm 1551 (busca todos los ficheros con el Sticky bit con permiso 551)
find . -type f -name «borrador.txt» -exec rm -f {} ; (busca ese fichero y lo remueve)
find ~ -type f -exec ls -s {} ; | sort -n (lista los ficheros más grandes dentro de todas las carpetas)
find . -name «.*» (buscará ficheros ocultos)
find /dir/ -type f -not -name ‘Protec’ -delete (borra todo lo que hay en el directorio, excepto el fichero llamdo ‘Protec’)