Wie kann ich Dateien schneller finden als suchen oder suchen?

8

Ich habe den Befehl find verwendet, um Dateien auf meiner 1-TB-Festplatte zu finden. es dauert sehr lange. dann habe ich locate verwendet, was sich bei regelmäßiger Aktualisierung mit updateedb als schneller erwiesen hat. Die Einschränkung beim Suchen besteht jedoch darin, dass ich keine Dateien mit einer bestimmten Größe oder einer bestimmten Änderungs- / Erstellungszeit finden kann. Können Sie mir Ideen vorschlagen, wie Sie Dateien schneller finden oder in diesem Fall die Ausgabe des Befehls "locate" so weiterleiten können, dass alle anderen Informationen wie Größe, Zeit usw. angezeigt oder in eine Datei umgeleitet werden können?

Chaitanya
quelle
Können Sie bitte ein Beispiel für den vollständigen findBefehl geben, einschließlich der Argumente, die zu lange dauern? Oder findist langsam mit irgendwelchen Argumenten für Sie? Auf meinem System scannt find das gesamte Dateisystem innerhalb von 2 Sekunden (100 GB).
arrangieren
Ich habe vor einiger Zeit die native "Suchoption" durch "gnome-do" do.davebsd.com ersetzt , mit der Sie nach Dateien jeglicher Art suchen können und die Möglichkeiten für schnellen Zugriff und erweiterte Unterfunktionen wie Öffnen, Bearbeiten, An Mail senden, als Befehl öffnen usw. Vielleicht finden Sie es hilfreich!
v2r
@Chaitanya Fehlt meiner Antwort etwas, das Sie brauchen?
RobotHumans
Einer meiner Kollegen schlug mir eine Idee vor, die Datenbank "find" mit "find" zu verwenden, damit sie schneller funktioniert. Find $ (find -d external.db 1.txt) Das ist definitiv viel schneller, aber es gibt ein Problem, dass es nicht funktioniert auf Dateinamen mit Leerzeichen oder Sonderzeichen. Alle Ideen zur Verfeinerung des Befehls sind herzlich willkommen
Chaitanya
@arrange: Ich bin nicht er, aber es finddauert einige Minuten, bis ich auf meinem Medien- und Image-Home-Server bin . root@viashivan:/media/data1# find . -type f | wc -lund das Ergebnis ist 2044791.

Antworten:

2

Ich habe keine Antwort gesehen, die den Wünschen von Chaitanya nahe kommt. Wenn Sie nach Dateinamen suchen möchten, kann eine Kombination aus Suchen, Suchen, ls und grep ausreichend sein. Aber ich denke, Chaitanya möchte zum Beispiel nach "allen Dateien suchen, die vor 2011 erstellt wurden". Dies kann perfekt mit find gemacht werden, aber ich kann mir vorstellen, dass das Durchsuchen von 1 TB lange dauern wird (hängt mehr von der Anzahl der Dateien ab, nicht unbedingt von der Gesamtgröße). Um dies zu beschleunigen, halte ich eine Indizierung für unvermeidlich. Das Problem beim Suchen (Indizieren mit updateb) besteht darin, dass die Erstellungszeit nicht indiziert wird.

Was Chaitanya also braucht, ist etwas, das die benötigten Attribute von Dateien indiziert (Dateiname, Dateigröße, Erstellungsdatum, mehr?). Und später etwas, das nach diesen Attributen suchen kann. Soweit ich weiß, gibt es dafür unter Ubuntu keine sofort einsatzbereite Lösung.

Ein wichtiger Kommentar von Chaitanya: "Jetzt ist die Sache, dass ich eine PHP-basierte Web-GUI entwerfe ...". Da Ihr Problem sehr spezifisch klingt, möchten Sie vielleicht selbst etwas aufbauen. Einige Vorschläge:

  • Indizieren Sie die Dateien in einer Datenbank (mit Cronjob) und verwenden Sie SQL zur Suche.

  • Verwenden Sie Lucene zum Indizieren und Suchen ( Zend Lucene für PHP)

Rachid
quelle
0

Sie können Tracker ausprobieren . Es verfügt über einen Daemon, der auf Dateiänderungen wartet und eine Datenbank mit allen Metadaten wie möglich aktualisiert, sowie einen Client, mit dem Sie nach Dateien suchen können. Beachten Sie, dass nur das Benutzerverzeichnis indiziert wird, nicht die gesamte Festplatte.

Das Hauptproblem ist, dass für die Indizierung CPU-Zeit benötigt wird. Verwenden Sie diese Funktion daher nur, wenn Ihr Computer über ausreichend Strom verfügt.

Sie müssen sowohl den Server als auch den Client installieren. Sie heißen tracker und tracker-gui. Wenn Sie im Software Center nach einem Tracker suchen, sind dies die beiden ersten Übereinstimmungen. Wenn Sie sie lieber über die Befehlszeile installieren möchten:

sudo apt-get install tracker tracker-gui
Javier Rivera
quelle
Jetzt entwerfe ich eine PHP-basierte Web-GUI, auf die von einem Remote-Computer aus zugegriffen werden kann. Daher kann ich nur Befehlszeilentools verwenden.
Chaitanya
0

Antwort auf Kommentar:

ls -la "$(locate -d external.db "Duel of Fates (Darth ")"

produziert:

-rw-rw-r-- 1 Benutzergruppe 4075134 2012-03-30 22:37 / home / user / Musik / Star Wars: Episode 1 - Duell der Schicksale (Darth Mauls Thema) .mp3

Danke @Oli im AskUbuntu-Chat, dass du mich auf "etwas" hingewiesen hast, um Shell-Fluchten zu umgehen

RobotHumans
quelle
Einer meiner Kollegen schlug mir eine Idee vor, die Datenbank "find" mit "find" zu verwenden, damit sie schneller funktioniert. Find $ (find -d external.db 1.txt) Das ist definitiv viel schneller, aber es gibt ein Problem, dass es nicht funktioniert auf Dateinamen mit Leerzeichen oder Sonderzeichen. Alle Ideen zur Verfeinerung des Befehls sind herzlich willkommen
Chaitanya
0

Das Problem bei der Suche ist, dass nur gelegentlich Dateiinformationen nach einem regulären Cron-Zeitplan erfasst werden. Wenn Sie mlocate benötigen, um die Informationen zu aktualisieren, führen Sie dies einfach aus

$ sudo /etc/cron.daily/mlocate

Wenn Sie eine Lösung benötigen, die mehr "in Echtzeit" ist und ständig aktualisiert wird, würde ich empfehlen, etwas zu verwenden, das speziell für die Überwachung Ihres Dateisystems entwickelt wurde, wie tracker-guiJavier Rivera sagte.

Um die Ausgabe von locatein eine Datei umzuleiten , verwenden Sie einfach einen Pfeil >anstelle des Pipe- |Zeichens. (Ein Pfeil überschreibt eine Ausgabedatei, wenn sie bereits vorhanden ist. Zwei Pfeile werden an eine Ausgabedatei angehängt, falls sie bereits vorhanden ist.)

$ locate filename > output.txt  # Overwrite
$ locate filename >> output.txt # Append
Sepero
quelle
0

Verwenden Sie "find option Parameter". Siehe "Mann finden" mehr Details. Verwendung findet , ein Dokument schnell und einfach zu finden, zum Beispiel. "find * .jpg"

user49695
quelle
Einer meiner Kollegen schlug mir eine Idee vor, die Datenbank "find" mit "find" zu verwenden, damit sie schneller funktioniert. Find $ (find -d external.db 1.txt) Das ist definitiv viel schneller, aber es gibt ein Problem, dass es nicht funktioniert auf Dateinamen mit Leerzeichen oder Sonderzeichen. Alle Ideen zur Verfeinerung des Befehls sind herzlich willkommen
Chaitanya
0

Verwenden Sie das Gnome-Suchwerkzeug

Es bietet

  • Dateiinhalt
  • Änderungsdatum
  • Größe
  • Datei Leere
  • Besitzer / Gruppe
  • Ausschluss von Namensmustern
  • Name Übereinstimmung mit regulären Ausdrücken
  • Versteckte und gesicherte Dateien
totti
quelle
0

So leiten Sie die Ausgabe des Befehls "locate" so weiter, dass alle anderen Informationen wie Größe, Zeit usw. angezeigt oder in eine Datei umgeleitet werden können.

In dieser Antwort wurde viel Zeit und Mühe aufgewendet, um dieses Problem zu lösen:

Dieser Code kann auf Ihre locateBedürfnisse verkleinert werden :

$ time locate -0 *.mp4 | xargs -0 ls -s

     4 /home/rick/askubuntu/subdir-A/1.mp4
     4 /home/rick/askubuntu/subdir-A/2.mp4
         ( ... SNIP ... )
  3684 /mnt/d/Windows/WinSxS/amd64_microsoft-windows-winsatmediafiles_31bf3856ad364e35_10.0.10586.0_none_51eff420121c1922/Clip_480_5sec_6mbps_h264.mp4
 35972 /mnt/old/home/rick/Videos/VID_20180701_233225.mp4

real    0m0.900s
user    0m0.826s
sys     0m0.084s

Zusammenbruch locate -0 *.mp4 | xargs -0 ls -s:

  • locate -0- Der Befehl find druckt normalerweise eine neue Zeile ( \n) am Ende jedes Eintrags. 0weist Lokalisieren an, Einträge stattdessen mit einem Null-Byte zu trennen.
  • *.mp4 Suchen Sie alle Dateien, die auf .mp4 enden (Audiodateien).
  • |ist das Pipe-Zeichen. Was auch immer mit dem Befehl "Lokalisieren" gedruckt wird, wird nicht auf dem Bildschirm angezeigt, sondern zum nächsten Befehl umgeleitet.
  • xargs -0- Der Befehl xargs nimmt die Eingabe für Eingabe vom vorherigen Befehl (Suchen) entgegen und übergibt sie an den nächsten Befehl. -0bedeutet, dass Einträge durch ein Null-Byte und nicht durch ein newline ( \n) -Trennzeichen getrennt sind.
  • ls -sDer lsBefehl wird von aufgerufen xargsund der Dateiname an list übergeben. Das -sFlag gibt lsan, dass die Dateigröße angegeben werden soll.

Wie Sie sehen, dauert der Vorgang für mehr als eine Million Dateien in drei Ubuntus- und zwei Windows-Partitionen weniger als 1 Sekunde.

WinEunuuchs2Unix
quelle