Ich suche nach einer Möglichkeit, Dateitypen in einem Ordner mit Tausenden von Dateien zu bestimmen. Dateinamen verraten nicht viel und haben keine Erweiterung, sind aber verschiedene Typen. Insbesondere versuche ich festzustellen, ob eine Datei eine SQLite-Datenbank ist.
Bei Verwendung des file
Befehls wird der Typ von 2-3 Dateien pro Sekunde bestimmt. Dies scheint ein guter Weg zu sein, um das Problem anzugehen, außer es ist zu langsam.
Dann habe ich versucht, jede Datei mit sqlite3 zu öffnen und zu überprüfen, ob ich einen Fehler erhalte. Auf diese Weise kann ich 4-5 Dateien pro Sekunde überprüfen. Viel besser, aber ich denke, dass es einen besseren Weg gibt, dies zu tun.
performance
sqlite
file-command
dmars
quelle
quelle
file
laufen auf 2115 Dateien ohne spezielle Optionen0m0.117s user 0m0.078s sys 0m0.044s
für michAntworten:
2-3 Dateien pro Sekunde getestet mit
file
scheint mir sehr langsam.file
führt tatsächlich eine Reihe verschiedener Tests durch, um den Dateityp zu bestimmen. Da Sie nach einem bestimmten Dateityp (SQLite) suchen und sich nicht darum kümmern, alle anderen zu identifizieren, können Sie mit einer bekannten SQLite-Datei experimentieren, um festzustellen, welcher Test sie tatsächlich identifiziert. Sie können dann die anderen mithilfe des-e
Flags ausschließen und für Ihren vollständigen Dateisatz ausführen. Siehe die Manpage :Edit: Ich habe selbst einige Tests ausprobiert. Zusammenfassung:
file
bei Tests zur Bestimmung von SQLite um etwa 15% beschleunigen . Welches ist etwas, aber nicht die enorme Verbesserung, die ich erwartet hatte.file
oder ...?Für eine 16 MB SQLite-DB-Datei habe ich Folgendes getan:
Timing in der Kommandozeile:
Wenn Sie versuchen, die verschiedenen Tests auszuschließen, und vorausgesetzt, dass die Bestimmung auf der Grundlage eines einzelnen Tests erfolgt, ist es der "weiche" Test (dh die Suche nach magischen Dateien), der die Datei identifiziert. Dementsprechend habe ich den
file
Befehl geändert , um alle anderen Tests auszuschließen:1000 Mal ausgeführt:
quelle
sqlite=$(echo $filetype | grep -c SQLite)
mindestens die gleiche Zeit wie der Dateibefehl erfordert. Und ich habe einige andere Befehle, die den Vorgang zusätzlich verlangsamen. Interessanterweise war das Ausführensqlite3 $filename ".schema"
immer noch zweimal schneller als der Dateibefehl.Wenn Sie sich Folgendes ansehen: http://www.sqlite.org/fileformat.html , beginnt das SQLite-Format mit der Zeichenfolge "SQLite-Format 3 \ 000". Es scheint mir, dass Sie
head -c 16
die Datei überprüfen könnten , um das Format zu überprüfen. Ich würde erwarten, dass dies schneller ist als mit allgemeineren Tools.quelle
Wenn Sie sich
file
die magische Beschreibung für SQLite-Dateien ansehen , sucht sie entwederSQLite format 3
oder** This file contains an SQLite
am Anfang der Datei.Sie können also entweder eine magische Datei mit nur diesen Überprüfungen erstellen (und die integrierten Tests wie in der Lösung @ire_and_curses deaktivieren) oder die Überprüfung manuell durchführen:
Nicht sehr effizient, da eine
head
Datei ausgeführt wird. Mit ein wenig Aufwand könnten Sie es wahrscheinlich in Perl tun, um die ersten 31 Bytes mehrerer Dateien in einem Perl-Aufruf zu lesen.quelle