Me las arreglé para pegarme un tiro donde duele (realmente mal) reformateando una partición que contenía datos valiosos. Por supuesto que no fue intencional, pero sucedió.
Sin embargo, logré usar testdisk
y photorec
recuperar la mayoría de los datos. Así que ahora tengo todos esos datos distribuidos en casi 25,000 directorios. La mayoría de los archivos son archivos .txt, mientras que el resto son archivos de imagen. Hay más de 300 archivos .txt en cada directorio.
Puedo grep
o uso find
extraer ciertas cadenas de los archivos .txt y enviarlas a un archivo. Por ejemplo, aquí hay una línea que he usado para verificar que mis datos están en los archivos recuperados:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Puedo enviar "searchPattern" a un archivo, pero eso solo me da ese patrón. Esto es lo que realmente me gustaría lograr:
Revisa todos los archivos y busca una cadena específica. Si esa cadena se encuentra en un archivo, cat TODOS los contenidos de ese archivo en un archivo de salida. Si el patrón se encuentra en más de un archivo, agregue el contenido de los archivos posteriores a ese archivo de salida. Tenga en cuenta que simplemente no quiero generar el patrón que estoy buscando, sino TODOS los contenidos del archivo en el que se encuentran los patrones.
Creo que esto es factible, pero simplemente no sé cómo tomar todo el contenido de un archivo después de extraer un patrón específico de él.
fuente
Respuestas:
Si entiendo tu objetivo correctamente, lo siguiente hará lo que quieras:
Esto buscará todos los
*.txt
archivos./recup*/
, probará cada unosearchPattern
, si coincide, aparecerácat
el archivo. La salida de todos loscat
archivos ed se dirigirá aoutputfile.txt
.Repita para cada patrón y archivo de salida.
Si tiene una gran cantidad de directorios coincidentes
./recup*
, puede terminar con unargument list too long error
. La forma simple de evitar esto es hacer algo como esto:Esto coincidirá con la ruta completa. Entonces
./recup01234/foo/bar.txt
será igualado. El-mindepth 2
es para que no coincida./recup.txt
, o./recup0.txt
.fuente
grep -l
), luego|sort|uniq
ycat
desde la lista de archivos.En lugar de mostrar su patrón, envíe el nombre de archivo usando "-l" en grep, y luego úselo como entrada para cat.
o
Sospecho que puede completar los detalles restantes. Por cierto, si puede tener espacios u otros caracteres extraños en los nombres de archivo (poco probable en este caso específico, pero para fines futuros), use -print0 en el hallazgo y -Z en el grep, combinado con la opción -0 en xargs para usar bytes nulos entre nombres de archivo en lugar de líneas nuevas.
fuente
\+
lugar de\;
evitar ese problema, pero no sé cómo funciona con un par de argumentos -exec (sospecho que "mal"). Usando un par de xargs, solo tendrás un par de nuevos procesos generados, que deberían ser más rápidos con muchos archivos.>afile
o|acommand
o lo que sea apropiado para su situación. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
lugar dexargs sudo
. Cuando ejecutaxargs sudo
, construye la línea de comando asumiendo que el comando essudo cat args
. Pero cat está en / bin, entonces sudo corre/bin/cat args
. Si su comando está en un directorio más largo, como / usr / local / bin, entonces el comando sudo realmente se ejecuta podría resultar en una línea de comando demasiado larga y un error que es difícil de rastrear. Además de eso,sudo xargs
solo registra que ejecutó xargs, mientras quexargs sudo
registra el comando con todos los argumentos, lo que resulta en algunas largas líneas de registro de sudo. :)Este no es exactamente el código óptimo, pero es muy sencillo y funcionará bien si la eficiencia no es un problema. El problema es que examinará los archivos varias veces, incluso si la cadena ya se ha encontrado en ellos.
En primer lugar, busque sus cadenas y escriba los archivos coincidentes en una lista.
Repita este paso reemplazando
searchPattern
según sea necesario. Esto produce una lista de archivos coincidentes en/tmp/file_list
.El problema es que este archivo puede tener duplicados. Por lo tanto, podemos reemplazar los duplicados con
|sort|uniq
. Lasort
parte coloca los duplicados adyacentes entre sí, para queuniq
pueda eliminarlos. Luego puedecat
usar estos archivos juntosxargs
(con cada nombre de archivo separado por nueva línea\n
). Por lo tanto,A diferencia de las otras respuestas, esto tiene dos pasos y un archivo temporal, por lo que realmente solo lo recomendaría si tiene múltiples patrones para encontrar.
fuente
Dependiendo de su shell y entorno, podría hacer algo como esto (en bash)
Si desea separar los resultados de acuerdo con el patrón, puede modificarlo a algo como
fuente
while
bucle lee entonces que las listas y hace elgrep
/ condicionalcat
parte.#!/bin/bash
, hacerlo ejecutablechmod +x recoverData.sh
y ejecutarlo usando./recoverData.sh
. No lo usesh recoverData.sh
ya que/bin/sh
es probable que sea unadash
cáscara .