Linux es poderoso y los comandos que este sistema operativo tiene, te pueden ayudar a hacer una gran cantidad de cosas, algunas poco comunes, otras algo complicadas y entre mayor sea el número de cosas que debas hacer y que te tomen tiempo o esfuerzo (manual) siempre es mejor tomarse un tiempo para encontrar el comando correcto que lo haga por ti. Aqui te comparto como encontrar una lista de archivos en linux desde multiples directorios con un simple comando.
Cómo encontarar una lista de archivos en múltiples directorios
Te explico un poco el contexto. Hace algunos días un cliente con el que tengo ya varios años trabajando me pidió que debía recopilar una serie de archivos que se encontraban en varios servidore en cientos de directorios y requería archivos esécificos que sumaban varios cientos de archivos. Cuando son 5 o 10 archivo en dos o tres directorios en dos o tres servidores la verdad es que manualmente se puede haccer, con algo de pasiencia accedes a cada servidor y en las rutas localizas y copias el archivo, punto. Pero con esta cantidad de archivos esto tardaria semanas.
Algo importante a decir es que los archivos eran pequeños, de poco tamaño, entre 5 y 50 kb por archivo y podían ser temporalmente copiados a otro recurso (hay veces que son confidenciales o cosas por el estilo), por lo esto ayudó bastante a una solución más ágil.
Primper paso concentrar toda la gama de documentos en un solo sistema
Para facilitar ala búsqueda copié temporalmente todo en un solo servidor con espacio suficiente ubicando toda la estructura de archivos por hostmame como un directorio. Así que creé la un directorio por cada host.
mkdir server1 server2 server10
Luego ejecuté un rsync por cada servidor para copiar los archivos y tenerlos todos en un solo directorio local. Algo asi como esto:
rsync -av root@192.168.7.31:/home/aplicacion/xml/ ./server1/
rsync -av root@192.168.7.47:/home/aplicacion/xml/ ./server2/
rsync -av root@192.168.7.30:/home/aplicacion/xml/ ./server10/
La lista de archivos que solicitaron era vastante extensa y veía como un excel por lo que copié la columna del nombre de los archivos y lo cuardé en un archivo llamado lista.txt
El siguiente paso es crear un carpeta llamada envio en donde depositaría los archivos encontrados mediante una copia.
mkdir envio
Por ultimo ejecutar el comando find mediante el comando se para poder encontrar lo que está en el archivo lista.txt en todos los directorios de los servidores y que lo que encontrara lo copiara en la carpeta envio.
find ./server*/ | grep -f <(sed ‘s@^@/@; s/$/$/; s/([.[*]|])/\\1/g’ lista.txt) | xargs -I{} cp «{}» ./envio/
Te explico este comanodo.
la primera parte encuantra todos los archivos dentro de todos los directorios que empiesen con «server» por lo que server1, server2, serverX cumplen con este criterio y devuelven todos los archivos que hay dentro.
find ./server*/
luego el comando grep recibe una entrada de la ejecución del comando sed que leé la lista de archivos y los pasa a grep como «lo que se busca» en lo que se enviá del comando find por el pipe. En otras palabras grep filtra la salida de find a solo lo que hay en el archivo (los archivos que buscamos)
grep -f <(sed 's@^@/@; s/$/$/; s/([.[*]|])/\\1/g' lista.txt)
Luego, los archivos encontrados son copiados al directorio envio
xargs -I{} cp "{}" ./envio/
Esto me ayudó a encontrar varios cientos de archivos específicos en mas de 1000 directorios diferentes que estaban en varias decenas de servidores, todo esto en menos de 20 minutos que me tomó crear el comando y tener las copias. Encontrar una lista de archivos en linux puede ser más facil de lo que parece
Así es como varios comandos en Linux puede hacer de una taréa que parece imposible o extremadamente tardada, repetitiva y que te haría dar cientos o miles de clicks, y transfromarla en «Abrir una terminal, copiar algunos comandos y esperar el resultado» en unos minutos