Ich habe es geschafft, mich dort zu fotografieren, wo es weh tut (wirklich schlimm), indem ich eine Partition neu formatiert habe, die wertvolle Daten enthielt. Natürlich war es nicht beabsichtigt, aber es ist passiert.
Es gelang mir jedoch, die meisten Daten zu verwenden testdisk
und photorec
wiederherzustellen. Jetzt habe ich all diese Daten auf fast 25.000 Verzeichnisse verteilt. Die meisten Dateien sind TXT-Dateien, während der Rest Bilddateien sind. In jedem Verzeichnis befinden sich mehr als 300 TXT-Dateien.
Ich kann grep
oder kann find
bestimmte Zeichenfolgen aus den TXT-Dateien extrahieren und in eine Datei ausgeben. In der folgenden Zeile habe ich beispielsweise überprüft, ob sich meine Daten in den wiederhergestellten Dateien befinden:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Ich kann "searchPattern" in eine Datei ausgeben, aber das gibt mir nur dieses Muster. Folgendes möchte ich wirklich erreichen:
Durchsuchen Sie alle Dateien und suchen Sie nach einer bestimmten Zeichenfolge. Wenn diese Zeichenfolge in einer Datei gefunden wird, ordnen Sie den gesamten Inhalt dieser Datei einer Ausgabedatei zu. Wenn das Muster in mehr als einer Datei gefunden wird, hängen Sie den Inhalt nachfolgender Dateien an diese Ausgabedatei an. Beachten Sie, dass ich nicht das gesuchte Muster ausgeben möchte, sondern den gesamten Inhalt der Datei, in der sich die Muster befinden.
Ich denke, das ist machbar, aber ich weiß einfach nicht, wie ich den gesamten Inhalt einer Datei abrufen soll, nachdem ich ein bestimmtes Muster daraus entnommen habe.
quelle
Antworten:
Wenn ich Ihr Ziel richtig verstehe, wird Folgendes tun, was Sie wollen:
Dies sucht nach allen
*.txt
Dateien in./recup*/
, testet jede aufsearchPattern
, wenn es mitcat
der Datei übereinstimmt . Die Ausgabe allercat
ed-Dateien wird geleitetoutputfile.txt
.Wiederholen Sie dies für jedes Muster und jede Ausgabedatei.
Wenn Sie eine sehr große Anzahl übereinstimmender Verzeichnisse haben
./recup*
, erhalten Sie möglicherweise eineargument list too long error
. Der einfache Weg, dies zu umgehen, besteht darin, stattdessen so etwas zu tun:Dies entspricht dem vollständigen Pfad. Also
./recup01234/foo/bar.txt
wird abgestimmt. Das-mindepth 2
ist so, dass es nicht passt./recup.txt
, oder./recup0.txt
.quelle
grep -l
), dann|sort|uniq
undcat
aus der Dateiliste.Anstatt Ihr Muster auszugeben, geben Sie den Dateinamen mit "-l" auf grep aus und verwenden Sie diesen dann als Eingabe für cat.
oder
Ich vermute, dass Sie die restlichen Details eintragen können. Übrigens, wenn Sie möglicherweise Leerzeichen oder andere ungerade Zeichen in den Dateinamen haben (in diesem speziellen Fall unwahrscheinlich, aber für zukünftige Zwecke), verwenden Sie -print0 für die Suche und -Z für das grep, kombiniert mit der Option -0 für die zu verwendenden xargs Null-Bytes zwischen Dateinamen und keine Zeilenumbrüche.
quelle
\+
eher verwenden als\;
vermeiden, aber ich weiß nicht, wie das mit einem Paar von -exec-Argumenten funktioniert (ich vermute "schlecht"). Wenn Sie ein Paar xargs verwenden, werden nur ein paar neue Prozesse erzeugt, die mit vielen Dateien schneller sein sollten.>afile
oder|acommand
oder was auch immer für Ihre Situation geeignet ist. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
anstelle vonxargs sudo
. Wenn Sie ausführenxargs sudo
, wird die Befehlszeile unter der Annahme erstellt, dass der Befehl lautetsudo cat args
. Aber Katze ist in / bin, also rennt sudo/bin/cat args
. Befindet sich Ihr Befehl in einem längeren Verzeichnis wie / usr / local / bin, führt der tatsächlich ausgeführte Befehl sudo möglicherweise zu einer zu langen Befehlszeile und einem Fehler, der schwer zu finden ist. Darüber hinaus wirdsudo xargs
nur protokolliert, dass Sie xargs ausgeführt haben, währendxargs sudo
der Befehl mit allen Argumenten protokolliert wird - was zu einigen langen Sudo-Protokollzeilen führt. :)Dies ist kein optimaler Code, aber er ist sehr einfach und funktioniert einwandfrei, wenn Effizienz kein Problem darstellt. Das Problem ist, dass die Dateien mehrmals durchsucht werden, auch wenn die Zeichenfolge bereits darin gefunden wurde.
Suchen Sie zunächst nach Ihren Zeichenfolgen und schreiben Sie die passenden Dateien in eine Liste.
Wiederholen Sie diesen Schritt bei
searchPattern
Bedarf. Dies erzeugt eine Liste übereinstimmender Dateien unter/tmp/file_list
.Das Problem ist, dass diese Datei möglicherweise Duplikate enthält. Daher können wir die Duplikate durch ersetzen
|sort|uniq
. Dassort
Teil platziert die Duplikate nebeneinander, so dassuniq
sie entfernt werden können. Dann können Siecat
diese Dateien zusammen mitxargs
(wobei jeder Dateiname durch Zeilenumbruch getrennt ist\n
). Daher,Im Gegensatz zu den anderen Antworten enthält diese zwei Schritte und eine temporäre Datei. Ich würde sie daher nur empfehlen, wenn Sie mehrere Muster finden müssen.
quelle
Abhängig von Ihrer Shell und Umgebung könnten Sie so etwas (in Bash)
Wenn Sie die Ergebnisse nach Mustern trennen möchten, können Sie dies in etwa ändern
quelle
while
Schleife liest dann diese Liste und führt dengrep
/ bedingtencat
Teil aus.#!/bin/bash
, deren erste Zeile den Shebang enthält , ihn ausführbar machenchmod +x recoverData.sh
und mit ausführen./recoverData.sh
. Sie nicht verwenden ,sh recoverData.sh
da/bin/sh
wahrscheinlich eine istdash
Shell .