J'ai réussi à me tirer là où ça fait mal (vraiment mal) en reformatant une partition qui contenait des données précieuses. Bien sûr, ce n'était pas intentionnel, mais c'est arrivé.
Cependant, j'ai réussi à utiliser testdisk
et photorec
à récupérer la plupart des données. Alors maintenant, j'ai toutes ces données réparties sur près de 25 000 répertoires. La plupart des fichiers sont des fichiers .txt, tandis que les autres sont des fichiers image. Il y a plus de 300 fichiers .txt dans chaque répertoire.
Je peux grep
ou utiliser find
pour extraire certaines chaînes des fichiers .txt et les exporter vers un fichier. Par exemple, voici une ligne que j'ai utilisée pour vérifier que mes données se trouvent dans les fichiers récupérés:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Je peux sortir "searchPattern" dans un fichier, mais cela me donne juste ce modèle. Voici ce que j'aimerais vraiment accomplir:
Parcourez tous les fichiers et recherchez une chaîne spécifique. Si cette chaîne se trouve dans un fichier, transférez TOUT le contenu de ce fichier dans un fichier de sortie. Si le modèle se trouve dans plusieurs fichiers, ajoutez le contenu des fichiers suivants à ce fichier de sortie. Notez que je ne veux simplement pas sortir le motif que je recherche, mais TOUT le contenu du fichier dans lequel les motifs sont trouvés.
Je pense que c'est faisable, mais je ne sais tout simplement pas comment récupérer tout le contenu d'un fichier après avoir récupéré un modèle spécifique.
la source
Réponses:
Si je comprends bien votre objectif, ce qui suit fera ce que vous voulez:
Cela cherchera tous les
*.txt
fichiers dans./recup*/
, testez chacun d'euxsearchPattern
, s'il correspond,cat
le fichier. La sortie de tous lescat
fichiers ed sera dirigée versoutputfile.txt
.Répétez l'opération pour chaque modèle et fichier de sortie.
Si vous avez un très grand nombre de répertoires correspondant
./recup*
, vous pourriez vous retrouver avec unargument list too long error
. Le moyen le plus simple est de faire quelque chose comme ceci à la place:Cela correspondra au chemin complet. Ainsi
./recup01234/foo/bar.txt
sera apparié. Le-mindepth 2
est pour qu'il ne corresponde pas./recup.txt
, ou./recup0.txt
.la source
grep -l
), puis|sort|uniq
etcat
de la liste des fichiers.Plutôt que de sortir votre modèle, sortez le nom de fichier en utilisant "-l" sur grep, puis utilisez-le comme entrée pour cat.
ou
Je soupçonne que vous pouvez remplir les détails restants. BTW, si vous pouvez avoir des espaces ou d'autres caractères impairs dans les noms de fichiers (peu probable dans ce cas spécifique, mais à des fins futures), utilisez -print0 sur la recherche et -Z sur le grep, combiné avec l'option -0 sur xargs à utiliser octets nuls entre les noms de fichiers plutôt que les sauts de ligne.
la source
\+
plutôt que\;
d'éviter ce problème, mais je ne sais pas comment cela fonctionne avec une paire d'arguments -exec (je soupçonne "mal"). En utilisant une paire de xargs, vous n'aurez que quelques nouveaux processus générés, ce qui devrait être plus rapide avec beaucoup de fichiers.>afile
ou|acommand
ou tout ce qui est approprié pour votre situation. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
place dexargs sudo
. Lorsque vous exécutezxargs sudo
, il crée la ligne de commande en supposant que la commande estsudo cat args
. Mais cat est dans / bin, alors sudo s'exécute/bin/cat args
. Si votre commande se trouve dans un répertoire plus long, comme / usr / local / bin, alors la commande sudo s'exécute réellement peut entraîner une ligne de commande trop longue et une erreur qui est difficile à localiser. En plus de cela,sudo xargs
enregistre simplement que vous avez exécuté xargs, tandis quexargs sudo
enregistre la commande avec tous les arguments - résultant en de longues lignes de journal sudo. :)Ce n'est pas exactement du code optimal, mais il est très simple et fonctionnera bien si l'efficacité n'est pas un problème. Le problème est qu'il va parcourir les fichiers plusieurs fois, même si la chaîne y a déjà été trouvée.
Tout d'abord, recherchez vos chaînes et écrivez les fichiers correspondants dans une liste.
Répétez cette étape en remplaçant
searchPattern
si nécessaire. Cela produit une liste de fichiers correspondants sur/tmp/file_list
.Le problème est que ce fichier peut contenir des doublons. Par conséquent, nous pouvons remplacer les doublons par
|sort|uniq
. Lasort
pièce place les doublons les uns à côté des autres, afin deuniq
pouvoir les supprimer. Ensuite, vous pouvezcat
regrouper ces fichiers en utilisantxargs
(chaque nom de fichier étant séparé par une nouvelle ligne\n
). Par conséquent,Contrairement aux autres réponses, cela comporte deux étapes et un fichier temporaire, donc je ne le recommanderais vraiment que si vous avez plusieurs modèles à trouver.
la source
Selon votre shell et votre environnement, vous pourriez donc quelque chose comme ça (en bash)
Si vous souhaitez séparer les résultats selon le modèle, vous pouvez le modifier en quelque chose comme
la source
while
boucle lit ensuite cette liste et effectue la partiegrep
/ conditionnellecat
.#!/bin/bash
, le rendre exécutable avecchmod +x recoverData.sh
et l'exécuter avec./recoverData.sh
. Ne pas utilisersh recoverData.sh
car il/bin/sh
s'agit probablement d'undash
shell .