
Necesito buscar en un árbol de directorios grande una gran cantidad de nombres de archivos posibles, es decir, tengo un archivo de entrada con una larga lista de cadenas que necesito encontrar en el árbol (o como se muestra a continuación: imprimir todos los que no están en el árbol). árbol)
Como solución basada en un sistema de archivos, puedo hacer algo como esto:
while read a;
do
count=`find /path/to/dir -name "*$a*" | wc -l`; ;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
lo cual es tremendamente ineficiente dado el tamaño del árbol y el tamaño del archivo de entrada. Entonces pensé que podría simplemente volcar la salida find
en un archivo
find /path/to/dir > pathtodir_tree.txt
y luego grep el archivo.
while read a;
do
count=`grep $a pathtodir_tree.txt | wc -l`;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
que es mucho más rápido. Mis preguntas son: ¿me falta una solución basada en un sistema de archivos más eficiente? Si no es así, ¿existe otra solución que sea más eficiente (o, en general, mejor) que la solución basada en grep que propongo?
Respuesta1
Esto funciona para mí (si quieres encontrar esos archivosnopareo; de lo contrario, omita la v de la opción grep):
find /path/to/dir > tree.txt
grep -vf inputnames.txt tree.txt
Y si quieres saber cuantos hay:grep -vf inputnames.txt tree.txt | wc -l
Esto busca/cuenta todas las ocurrencias en tree.txt que nonocoincide con cualquiera de las cadenas en inputnames.txt
.