Ayer tuve la necesidad de buscar todos los archivos cuya ruta contenga una cadena específica, utilizando find
.
Veamos directamente un ejemplo: deseo buscar dentro del directorio /tmp
, todos los archivos que contengan la cadena "20150624" en alguna parte de su ruta (path).
Manos a la obra
Voy a crear un directorio llamado /tmp/20150624
con algunos archivos y subdirectorios:
[root@centos6 ~]# cd /tmp/ [root@centos6 tmp]# mkdir 20150624 [root@centos6 tmp]# cd 20150624/ [root@centos6 20150624]# dd if=/dev/zero of=error.log count=10 10+0 records in 10+0 records out 5120 bytes (5.1 kB) copied, 0.000165704 s, 30.9 MB/s [root@centos6 20150624]# mkdir temp [root@centos6 20150624]# touch temp/20150624.txt
El contenido final de dicho directorio es el siguiente:
[root@centos6 20150624]# ll -R .: total 12K -rw-r--r-- 1 root root 5.0K Jun 24 10:28 error.log drwxr-xr-x 2 root root 4.0K Jun 24 10:29 temp ./temp: total 0 -rw-r--r-- 1 root root 0 Jun 24 10:29 20150624.txt
Ahora bien, si busco todos los archivos cuyo nombre contenga la cadena "20150624", el resultado es el siguiente:
[root@centos6 20150624]# find /tmp -iname "*20150624*" /tmp/20150624 /tmp/20150624/temp/20150624.txt
Sólo encuentra el directorio 20150624
y el archivo 20150624.txt
. Esto se debe a que -iname
busca sólo en el nombre del archivo, sin considerar su ruta (camino de directorios desde la raíz hasta el directorio donde se encuentra el archivo). Lo cual es el comportamiento esperado, lógicamente. Si quisiésemos encontrar todos los archivos que contienen la cadena "20150624" en alguna parte de su ruta (aunque no sea en el nombre) se debe utilizar -iwholename
, el cual busca la cadena en cualquier parte de la ruta y el nombre del archivo:
[root@centos6 20150624]# find /tmp -iwholename "*20150624*" /tmp/20150624 /tmp/20150624/temp /tmp/20150624/temp/20150624.txt /tmp/20150624/error.log
Lo más interesante es que ambas opciones se pueden combinar.
Primero, voy a crear otro directorio dentro de /tmp
llamado temp
con algunos subdirectorios y archivos:
[root@centos6 20150624]# cd .. [root@centos6 tmp]# mkdir temp [root@centos6 tmp]# echo 0 > temp/error.log [root@centos6 tmp]# echo 0 > temp/error.log.1 [root@centos6 tmp]# echo 0 > temp/error.log.2 [root@centos6 tmp]# echo 0 > temp/error.log.3 [root@centos6 tmp]# mkdir temp/20150624 [root@centos6 tmp]# echo "hola" > temp/20150624/hola.txt [root@centos6 tmp]# mkdir temp/20150624/logs [root@centos6 tmp]# echo "hola" > temp/20150624/logs/Error.log
El contenido del nuevo directorio /tmp/temp
resulta:
[root@centos6 tmp]# ll -R temp/ temp/: total 20K drwxr-xr-x 3 root root 4.0K Jun 24 11:08 20150624 -rw-r--r-- 1 root root 2 Jun 24 11:13 error.log -rw-r--r-- 1 root root 2 Jun 24 11:12 error.log.1 -rw-r--r-- 1 root root 2 Jun 24 11:12 error.log.2 -rw-r--r-- 1 root root 2 Jun 24 11:12 error.log.3 temp/20150624: total 8.0K -rw-r--r-- 1 root root 5 Jun 24 11:08 hola.txt drwxr-xr-x 2 root root 4.0K Jun 24 11:07 logs temp/20150624/logs: total 4.0K -rw-r--r-- 1 root root 5 Jun 24 11:07 error.log
Por ejemplo, es posible buscar todos los archivos cuyo nombre contiene la cadena "error" y además en alguna parte de la ruta la cadena "20150624":
[root@centos6 tmp]# find /tmp -iwholename "*20150624*" -iname "*error*" /tmp/20150624/temp/error.log.1 /tmp/20150624/error.log /tmp/temp/20150624/logs/Error.log
Notar que en los resultados de la búsqueda no se incluyen los siguientes archivos, los cuales (a pesar de contener la cadena "error" en su nombre) no incluyen la cadena "20150624" en ninguna parte de la ruta:
[root@centos6 tmp]# find /tmp/temp -iwholename "*temp/error*" /tmp/temp/error.log /tmp/temp/error.log.2 /tmp/temp/error.log.1 /tmp/temp/error.log.3
Tampoco aparece en los resultados el archivo /tmp/temp/20150624/hola.txt
, el cual incluye la cadena "20150624" en su ruta ("/tmp/temp/20150624/"), pero no incluye la cadena "error" en su nombre ("hola.txt").
Para mayor información:
man find
Fuente: linuxito