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


Tal vez pueda interesarte


Compartí este artículo