Tengo una carpeta (técnicamente en este caso, una imagen de disco montada de sólo lectura) que contiene una tonelada de datos que obtuve al ejecutar Data Rescue (una aplicación de recuperación de datos) en una de mis grandes unidades de servidor. Hice varios tipos de escaneo diferentes y volqué todos los archivos en un solo lugar. Data Rescue "reconstruye" los archivos borrados y a menudo no lo hace del todo bien. Puede categorizar mal el tipo de archivo que es, y puede mezclar archivos separados.
Estoy buscando dos archivos PHP específicos (y quizás unos 5 más si tengo suerte). La mayoría de estos archivos recuperados no tienen nombre (0002, 0003, etc.), así que tengo que buscar por contenido.
He encontrado 6 cadenas diferentes que deberían poder identificar estos archivos específicos. Así que necesito una manera de buscar en el contenido de los archivos, no en una forma de "búsqueda mágica" de Apple, sino en una forma de "leer manualmente a través de cada archivo en busca de una cadena de coincidencia".
grep
parece la opción obvia, pero no ha dado más que problemas. grep puede buscar recursivamente, y puede descomprimir archivos gzip, zip y bzip, lo cual está muy bien. Pero después de unos minutos de ejecución, comienza a emitir errores de "demasiados archivos abiertos". No estoy seguro de por qué, es como si grep no cerrara un archivo después de abrirlo para buscar en él. También he tenido problemas con grep
simplemente se detiene... no se cierra, no se bloquea, no deja de responder, pero no utiliza más CPU, no lee nada del disco, simplemente se queda inactivo cuando debería estar buscando. TAMBIÉN he tenido problemas al ejecutar múltiples grep
búsquedas a la vez. grep
parece cargar los archivos línea por línea, por lo que algo como una imagen de disco se carga por completo en la memoria antes de la búsqueda. Pero sólo hay un archivo en todo este paquete que es más grande que la cantidad de RAM que tengo. Así que mientras hago una grep
a la vez, debería estar bien.
Este es el comando que estoy usando (envuelto en un script que hace varios comandos a diferentes archivos de salida, con alguna salida de estado): zfgrep -l -r -a -J -i -s -U -n "#32cd32" /Volumes/\'Storage\'\ Original\ Recovery > 32cd32.txt
Esto funcionará durante un tiempo, luego se colgará. Obtendré algunos resultados pero no una búsqueda completa. Si quito el -s
, me llega la avalancha de too many open files
errores. Luego, por sugerencia de otra persona, uso find
para alimentar los archivos a grep
uno a la vez, así:
find /Volumes/\'Storage\'\ Original\ Recovery -exec zfgrep -l -r -a -J -i -s -U -n "#32cd32" {} \; -print > 32cd32.txt
Pero ese comando tiene exactamente los mismos problemas.
Así que esto me deja atascado. ¿Cómo puedo buscar en cada uno de los archivos de esta imagen de disco, incluidos los archivos, algunas cadenas de texto sin formato. ¿Incluyendo los archivos de datos binarios que pueden haber sido incorrectamente fusionados con archivos de texto plano? Esto no parece una tarea tan difícil para un ordenador moderno de varios núcleos con un sistema operativo actual, mucha memoria RAM y un SSD.
En realidad, preferiría una opción de GUI, pero en este punto tomaré cualquier solución que funcione.
También empecé a intentar hacer esto usando BBEdit, pero se saltaba un montón de tipos de archivos incluso cuando le decías que buscara en todos los archivos. Incluso los archivos basados en XML. Esto me sorprendió mucho.