Ich habe einen Ordner (in diesem Fall technisch gesehen ein schreibgeschütztes gemountetes Disk-Image), das eine Menge Daten enthält, die ich durch Ausführen von Data Rescue (einer Datenwiederherstellungs-App) auf einem meiner großen Serverlaufwerke erhalten habe. Ich habe mehrere verschiedene Scantypen durchgeführt und alle Dateien an einem Ort abgelegt. Data Rescue „rekonstruiert“ gelöschte Dateien und macht es oft nicht ganz richtig. Es kann den Dateityp falsch kategorisieren und einzelne Dateien zusammenfügen.
Ich suche zwei spezifische PHP-Dateien (und vielleicht etwa 5 andere, wenn ich Glück habe). Die meisten dieser wiederhergestellten Dateien haben keine Namen (0002, 0003 usw.), daher muss ich nach Inhalt suchen.
Ich habe mir 6 verschiedene Zeichenfolgen ausgedacht, die diese spezifischen Dateien identifizieren können sollten. Also brauche ich eine Möglichkeit, den Inhalt von Dateien zu durchsuchen, nicht in einer Apple "magischen Suche", sondern in einer alten Schule "manuelles Durchlesen jeder Datei auf der Suche nach einer Zeichenfolgenübereinstimmung".
grep
klingt wie die offensichtliche Wahl, aber es war nichts als Probleme. grep kann rekursiv suchen und gzip-, zip- und bzip-Archive dekomprimieren, was alles gut ist. Aber nach ein paar Minuten läuft es, es beginnt mit dem Streaming von "zu viele offene Dateien"-Fehlern. Ich bin mir nicht sicher warum, es ist, als ob grep eine Datei nicht schließt, nachdem es sie geöffnet hat, um darin zu suchen. Ich hatte auch Probleme damit, grep
einfach anzuhalten ... nicht zu beenden, nicht abzustürzen, nicht mehr zu reagieren, aber keine CPU mehr zu verbrauchen, nichts von der Festplatte zu lesen, einfach im Leerlauf zu sitzen, wenn es suchen sollte. Ich hatte auch Probleme, mehrere grep
Suchen gleichzeitig auszuführen.grep
scheint Dateien Zeile für Zeile zu laden, so dass so etwas wie ein Disk-Image das Ganze vor der Suche in den Speicher lädt. Aber es gibt nur eine Datei in diesem ganzen Bündel, die größer ist als die Menge an RAM, die ich habe. Solange ich also einen grep
nach dem anderen mache, sollte es mir gut gehen.
Dies ist der Befehl, den ich verwende (in einem Skript verpackt, das mehrere Befehle für verschiedene Ausgabedateien ausführt, wobei einige Status ausgegeben werden):zfgrep -l -r -a -J -i -s -U -n "#32cd32" /Volumes/\'Storage\'\ Original\ Recovery > 32cd32.txt
Dies wird eine Weile laufen, dann wird es hängen bleiben. Ich erhalte einige Ergebnisse, aber keine vollständige Suche. Wenn ich die entferne -s
, bekomme ich eine Flut von too many open files
Fehlern. Dann füttere ich auf Vorschlag einer anderen Person find
Dateien einzeln grep
wie folgt:
find /Volumes/\'Storage\'\ Original\ Recovery -exec zfgrep -l -r -a -J -i -s -U -n "#32cd32" {} \; -print > 32cd32.txt
Aber dieser Befehl hat genau die gleichen Probleme.
Das lässt mich also stecken. Wie kann ich jede einzelne Datei auf diesem Disk-Image, einschließlich der Archive, nach einfachen Textzeichenfolgen durchsuchen? Einschließlich binärer Datendateien, die möglicherweise fälschlicherweise mit reinen Textdateien zusammengeführt wurden? Für einen modernen Multicore-Rechner mit aktuellem OS, viel RAM und einer SSD scheint das keine allzu schwierige Aufgabe zu sein.
Eigentlich würde ich eine GUI-Option bevorzugen, aber an dieser Stelle nehme ich jede Lösung, die funktioniert.
Außerdem habe ich ursprünglich versucht, dies mit BBEdit zu tun, aber es hat viele Dateitypen übersprungen, selbst wenn Sie es angewiesen haben, alle Dateien zu durchsuchen. Sogar Dateien, die auf XML basieren. Darüber war ich sehr überrascht.
Bei effektiver Verwendung find ... -exec grep -r
wird das gesamte Verzeichnis mehrmals durchlaufen (einmal als Teil von find
, einmal als Teil von each grep -r
), was zu den angezeigten Fehlern führen kann. find
Sie sollten also entweder die oder die loswerden -r
. Da Sie den Teil verwenden grep
, um die zu sammelnden Dateien zu identifizieren, ist dies -r
in Ihrem Fall wahrscheinlich der.
kein Hang
grep
ist der Weg hierher. Sind Sie sicher,grep
dass das Problem hier liegt? Was passiert, wenn Sie laufenfind /... -print
, läuft es auch durch oder bricht es ab? Und Sie sollten es definitiv nicht bekommen ,too many open files
wenn Siefind ... -exec grep
es verwenden. Können Sie bitte für beide Befehle direkt aus dem Terminal kopieren / einfügen, damit wir sehen, was Sie sehen?kein Hang
grep -r
wenn Sie verwendenfind
, sonst durchlaufen Sie die Unterverzeichnisse zweimal (und erhalten den Fehler vonzfgrep
).Nimesh Neema
kein Hang
l008com
-type f
zum Find-Befehl hinzugefügt, damit Verzeichnisse übersprungen werden.l008com
l008com
Xcode
es versucht, aber ich weiß so wenig darüber, dass ich nicht weit gekommen bin. Ich habe versucht, alle Dateien einzufügen, aber es wurde versucht, sie alle zu indizieren. Eine indexbasierte Suche funktioniert dafür nicht, da die Art von Inhalt, nach der ich suche, höchstwahrscheinlich nicht indiziert wird, da es sich nicht um echte „Wörter“ handelt. Außerdem habe ich dort 370.000 Dateien abgelegt, aber es wurden nur 30.000 davon gescannt. Da bin ich natürlich nicht in meinem Element, aber hoffentlichfind/grep
funktioniert das Ding.fd0
-print
primäre aus Ihrer find-Anweisung entfernen. Es wiederholt nur die Ergebnisse vongrep
.l008com
Natsfan