Wie kann ich 360.000 Dateien durchsuchen, etwa 280 GB?

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".

grepklingt 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, grepeinfach 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 grepSuchen gleichzeitig auszuführen.grepscheint 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 grepnach 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 filesFehlern. Dann füttere ich auf Vorschlag einer anderen Person findDateien einzeln grepwie 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.

grepist der Weg hierher. Sind Sie sicher, grepdass das Problem hier liegt? Was passiert, wenn Sie laufen find /... -print, läuft es auch durch oder bricht es ab? Und Sie sollten es definitiv nicht bekommen , too many open fileswenn Sie find ... -exec grepes verwenden. Können Sie bitte für beide Befehle direkt aus dem Terminal kopieren / einfügen, damit wir sehen, was Sie sehen?
Ah, Sie brauchen nicht , grep -rwenn Sie verwenden find, sonst durchlaufen Sie die Unterverzeichnisse zweimal (und erhalten den Fehler von zfgrep).
Klingt vielleicht etwas kontraintuitiv, aber versuchen Sie, ein Xcode-Projekt zu erstellen, alle Dateien hinzuzufügen und die integrierte Suche von Xcode zu verwenden. Apple hat wiederholt behauptet, dass die Xcode-Textsuche im Vergleich zu grep um ein Vielfaches schneller ist. Außerdem bin ich mir nicht sicher und gehe davon aus, dass Xcode nicht auf die von Ihnen erwähnten Probleme stoßen sollte.
@NimeshNeema Ich weiß jedoch nicht, wie gut Xcode mit Binärdateien funktioniert
@nohillside testet jetzt ohne das -r, ich bin irgendwie erstaunt, wenn sich herausstellt, dass das alles ist. Auch -type fzum Find-Befehl hinzugefügt, damit Verzeichnisse übersprungen werden.
Ein paar Minuten lang gab es keine zu viele Dateien-Fehler. Also werde ich das vollständige Shell-Skript ohne die -r's laufen lassen, während ich schlafe. Ich melde mich also in ungefähr 12 Stunden mit einem Follow-up zurück ...
@NimeshNeema Ich habe Xcodees 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 hoffentlich find/grepfunktioniert das Ding.
Sie sollten die -printprimäre aus Ihrer find-Anweisung entfernen. Es wiederholt nur die Ergebnisse von grep.
Scheint zu funktionieren. Ich schätze, das streunende -r hat all meine Probleme verursacht!
Es hört sich so an, als wäre Ihr Problem gelöst. Ich wollte EasyFind vorschlagen, weil es nette Funktionen hat, um Ihre Suche einzugrenzen, aber ich denke, es verwendet höchstwahrscheinlich auch 'find' und 'grep'. EasyFind ist im MacApp Store kostenlos.

Antworten (1)

Bei effektiver Verwendung find ... -exec grep -rwird 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. findSie sollten also entweder die oder die loswerden -r. Da Sie den Teil verwenden grep, um die zu sammelnden Dateien zu identifizieren, ist dies -rin Ihrem Fall wahrscheinlich der.