Linux find Befehl - Fortschritt anzeigen

24

Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine Art Fortschrittsinformation anzuzeigen, wenn ich unter Linux nach Dateien suche find. Ich bin oft auf der Suche nach Dateien auf einer großen Festplatte und eine Art Fortschrittsanzeige wäre sehr hilfreich, wie eine Leiste oder zumindest das aktuelle Verzeichnis, in dem "gesucht" wird. Gibt es Skripte, die das tun oder die findeinige Hooks unterstützen? ?

Vlad Balmos
quelle
danke für die antworten, ich überprüfe alle lösungen und entscheide, welche besser ist. Wenn es nach mir ginge, würde ich alle Antworten als akzeptiert markieren.
Vlad Balmos
Abhängig davon, welche Suchkriterien Sie verwenden, ist locate viel schneller als find
B14D3

Antworten:

28

mit diesem trick siehst du den aktuellen ordner - aber keinen fortschrittsbalken - sorry.

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
quelle
Das ist cool. Bitte beachten Sie, dass Sie Superuser-Rechte benötigen, um auf cwd zugreifen zu können. Vielen Dank!
Vlad Balmos
Funktioniert perfekt.
Jesse Glick
8

Ein kleines Hilfsprogramm namens pv (pipe viewer) kann helfen. Aus der fantastischen Zusammenfassung von Peteris Krumins:

Pipe Viewer ist ein terminalbasiertes Tool zur Überwachung des Datenfortschritts über eine Pipeline.

Sie können pv auf verschiedene Arten verwenden. Wenn ich hier herumspiele, setze ich es direkt hinter eine Pipe, um den Fortschritt der von find erzeugten Ausgabe zu überwachen (sollte stdin an stdout unberührt übergeben).

find / -mtime -1h | pv > /dev/null

Die Ausgabe sieht dann ungefähr so ​​aus:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(Ich habe stdout nach / dev / null umgeleitet, damit ich den Fortschrittsbalken in Aktion sehen kann, ohne dass die Ausgabe vorbei fliegt. Dies ist wahrscheinlich nicht Ihre Absicht mit find, also passen Sie es entsprechend an.)

Ich bin mir ehrlich gesagt nicht sicher, wie gut das in freier Wildbahn funktioniert. Bei "teuren" Fundstücken wie dem oben beschriebenen (von der Wurzel ausgehend) schien es ziemlich gut zu funktionieren. Für einfachere Befehle in einem tieferen Knoten im Verzeichnisbaum ist pv kläglich fehlgeschlagen. Diese Befehle liefern sofort Ergebnisse, daher wird hier wahrscheinlich eine Fortschrittsanzeige angezeigt.

Spielen Sie auf jeden Fall herum und sehen Sie, ob dies überhaupt für das funktioniert, was Sie brauchen. Zumindest Denkanstöße.

tcdyl
quelle
Was würde dieser Fortschrittsbalken anzeigen? Weder wissen findnoch pvwie lange die Suche dauern wird, so dass sie den Prozentsatz nicht berechnen können. In der pvAusgabe sehen wir nur die Zeit seit Beginn der Suche.
Minaev
Das ist richtig. Ich hatte gedacht, dass irgendwo etwas Magisches vor sich geht, das es pv ermöglicht, den Fortschritt des Verzeichnisdurchlaufs zu überprüfen (was falsch ist). Bei konstanter Standardeingabe bewegt pv den Fortschrittsbalken einfach mit einer konstanten Frequenz. Versuchen Sie yes | pv > /dev/nullzu beobachten
tcdyl
1
+1 für ein schönes Dienstprogramm
Vlad Balmos
Fortschritte zu beurteilen ist nicht trivial. Nicht einmal Webbrowser, die Seiten laden, sind dazu in der Lage. Ich schätze, für Dateiinhalte können Sie durch die Dateigröße dividieren, aber für Unix-Streams wissen Sie normalerweise nicht, wie viele Daten insgesamt vorhanden sind, und dieses Tool ist für jede Art von Stream-Daten gedacht, nicht nur für Dateien.
Sridhar Sarnobat
7

Ich habe heute danach gesucht und bin über Google hierher gekommen. Ich hatte einen langjährigen Fund, der unter OS X lief und anscheinend watchdort nicht existiert. Also hier ist eine andere Lösung:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = Liste der geöffneten Dateien
  • -Fn= Zeigen Sie einfach den Namen der Datei / des Verzeichnisses an (mit dem Präfix 'n'). Überspringen Sie diesen Befehl, wenn Sie die vollständige lsofAusgabe bevorzugen
  • -a= sag lsof, dass nur Zeilen angezeigt werden sollen, die allen Kriterien entsprechen (standardmäßig werden Zeilen angezeigt, die allen Kriterien entsprechen)
  • -c find= Show Dateien / Verzeichnisse , die durch Prozess namens geöffnet find(eigentlich Prozess , dessen Name beginnt mit find, aber es ist Groß- und so Finderwird nicht angezeigt )
  • -d cwd = zeige Zeilen mit FD (filedescriptor) cwd (aktuelles Arbeitsverzeichnis)
  • +r 10 = Ausgabe alle 10 Sekunden anzeigen, bis keine offenen Dateien mehr gefunden werden (Suche beendet)

Dies zeigt an, dass das Verzeichnis findalle 10 Sekunden verarbeitet wird. Es sollte also eine Vorstellung davon geben, ob findes noch funktioniert und wie weit es fortgeschritten ist.

Marie Fischer
quelle
5

Es gibt ein Beispiel für eine parallele Suche mit findin man find. Mit dieser Option können Sie mehrere Überprüfungen für jedes Element durchführen und abhängig von der jeweiligen Bedingung mehrere Aktionen ausführen. Die erste Prüfung kann beispielsweise einfach sein -print, sodass alle Namen auf stdout gedruckt werden. Die zweite Überprüfung wird tun, was Sie wollen. So etwas wie:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Wenn bei der zweiten Überprüfung auch die Dateinamen angezeigt werden sollen, können Sie einen von ihnen mit stderr umleiten -fprint /dev/stderr.

minaev
quelle
Ich habe das noch nicht getestet, aber ich denke, es ist der richtige Weg.
Rolf
2

AFAIK tut es nicht, und die Implementierung wäre nicht trivial.

... Hmm. Vielleicht ein Skript, das find <target dir> -type dzuerst ausgeführt wird, die Liste speichert und dann jedes Verzeichnis wiederholt, bevor find <list item> -maxdepth 1 <rest of find parameters>eine for-Schleife ausgeführt wird.

Beachten Sie, dass Sie einen / signifikanten / Leistungsverlust eintauschen, um vage zu sehen, was er tut.

Shadur
quelle
1

Dies ist eine Liste der aktuellen Dateien geöffnet finden , so ist es das gleiche, was finden sucht ‚jetzt‘.

Es ist so einfach wie die Abfrage der Adresse von Dateideskriptoren, die von find jede Sekunde verwendet werden , und greift nicht in find selbst ein. Sie können es auch mit jedem beliebigen Programm tun.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

Das grep -v /dev/ist zu verbergen Dateien STDOUT, STDIN und STDERR, die Dateien werden verwendet , um Daten zu empfangen und auf der Konsole zu drucken.

Gabriel Saraiva
quelle