Buscando archivos en linux (find)
La instrucción find tiene dos partes.
find [camino...] [expresión]
Camino es la ruta o rutas a partir de la cual empezara las búsquedas, puede ser una o más de una.
find ./PDF/ ./xarxa/ -iname "*.pdf"
Todos los pdf que hay en los directorios PDF y xarxa.
La parte de expresión empezara en el momento en que se encuentre uno de estos caracteres
“-” “(“ “)” “,” “!”
La mejor manera de entenderlo son con ejemplos
Búsqueda de un archivo.
find . -name “*.txt”
Nos devolverá todos los archivos con extensión txt que haya en el directorio y recursivamente en todos sus subdirectorios.
El comando find distingue entre mayúsculas y minúsculas, así la instrucción anterior no nos devolverá los ficheros que acaben en TXT. Para que no distinga entre mayúsculas y minúsculas tenemos la opción -iname.
find . -iname “*.txt”
Podemos ejecutar ordenes que afectaran a los ficheros encontrados.
find . -name "*.bak" -exec rm {} \;
Esta instrucción borraría todos los ficheros acabados en .bak, esto lo hace a través de la opción -exec acompañada de la instrucción a ejecutar, los corchetes {} se refieren a los ficheros que la instrucción find ha encontrado y la barra invertida \; indica el final de la instrucción.
find . -type d -exec ls {} \;
Otro ejemplo de este uso, lista el contenido de todos los directorios y subdirectorios de la ruta actual.
find ~/confidencial/* -type f -exec md5 {} >> MD5 \;
Nos busca todos los ficheros del directorio indicado “~/confidencial/*” y a cada uno le aplica la instrucción md5, guardando el resultado en un archivo llamado MD5.
También podemos hacer búsquedas condicionadas.
find . ! -iname “*.pdf” ! -name “*.jpg”
Que nos devuelve todos los archivos menos los acabados en .pdf o .jpg.
find . ! -iname “*a*” -iname “*.jpg”
Nos devolvería todos los jpg que no tengan en su nombre la letra “a”.
Find, por defecto omite los enlaces (links), si queremos que la búsqueda siga los enlaces tendremos que añadir la opción -follow.
find . -follow -name “*empresa*”
Tenemos que tener en cuenta que podemos caer en una especie de bucle, en el que los links nos hagan volver a pasar por un mismo directorio por el que ya hemos pasado.
Una opción que nos puede ayudar a evitar eso, es -maxdepth n, la que indicamos el número máximo de niveles a los que queremos que find llegue.
find .-follow -maxdepth 5 -name “*empresa*”
Las comparaciones numéricas se especifican como.
-
+n...............mayor que n
-
-n...............menor que n
-
n...............exactamente n
veámoslo.
ficheros a los que se ha accedido por última vez en los últimos 10 minutos.
find . -amin -10
ficheros a los que se accedido, por última vez, hace un año exactamente.
find . -atime 365
ficheros de tamaño superior a 1000 kb
find . -size +1000k
ficheros vacios.
find . -empty
find . -empty -type f
También podemos buscar por tipos.
buscar ficheros
find . -type f
buscar directorios
find . -type d
buscar enlaces simbólicos.
find . -type l
O también por los permisos que tengan concedidos o grupo al que pertenezcan.
buscar ficheros del grupo admin
find . -group admin
ficheros del usuario pepe
find . -user pepe
ficheros que no pertenezcan a ningún grupo o ningún usuario.
find . -nogroup
find . -nouser
ficheros que tengan todos los permisos concedidos para todos
find . -perm 777
Sobre los resultados de find se pueden ejecutar ciertas acciones, esto se hace indicándolo con -exec orden. la cadena {} se reemplazará por el nombre del fichero que se esta procesando.
find . -iname "*.html" -exec cat {} \;
Si substituimos -exec por -ok orden, tendrá el mismo efecto pero esta vez nos pedirá confirmación antes de ejecutar la orden.
find . -iname "*.html" -ok cat {} \;
Todas las expresiones que aquí se han mostrado y muchas más que hay disponibles (consultar man find), se pueden combinar entre ellas.
se han de cumplir las dos expresiones (and implícito)
expr1 expr2
Solo se ha de cumplir una de ellas
expr1 -or expr2
Si no se cumple la expr1
! expr1
si no se cumple la expr1 y se cumple expr2
! expr1 expr2
Copia todas las imágenes jpg o png del directorio Imágenes al directorio dibuix.
find ./Imágenes/* -iname "*.jpg" -or -iname "*.png" -exec cp {} tmp/dibuix \;
Ponemos en minúsculas todas las letras de los ficheros.
find -type f -exec rename 'tr/A-Z/a-z/' "{}" \;
Por último, este comando muchas veces nos devuelve una cantidad de errores que en la mayoría de los casos nos impiden poder ver los resultados. Para evitarlos lo que se hace es redireccionarlos hacia la papelera del sistema.
Si queremos buscar un fichero en todo el ordenador, haremos lo siguiente.
find / -iname nom_fichero
Esto nos devolvería una cantidad de avisos de permiso denegado, la forma de evitarlo es la siguiente.
find / -iname nom_fichero 2>/dev/null
Los errores (2) los redireccionamos (>) al vacío (/dev/null)
Bueno, las posibilidades son múltiples, solo tenéis que echarle un poco de imaginación.




