Frage Linux find Befehl - Zeige Fortschritt


Ich habe mich gefragt, ob es irgendeine Möglichkeit gibt, irgendwelche Fortschrittsinformationen anzuzeigen, wenn man nach Dateien in Linux sucht find. Ich finde mich 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 "suchen" sucht. Gibt es irgendwelche Skripte, die das tun oder tun find Unterstützung einiger Haken?


21
2017-12-15 08:16


Ursprung


danke für die Antworten, ich werde alle Lösungen überprüfen und entschieden, welche besser ist. Wenn es nach mir ginge, würde ich alle Antworten als akzeptiert markieren. - Vlad Balmos
Je nachdem, welche Suchkriterien youb verwendet, ist locate wesentlich schneller als Suchen - B14D3


Antworten:


Mit diesem Trick können Sie den aktuellen Ordner sehen - aber keine Fortschrittsanzeige - tut mir leid.

 watch readlink -f /proc/$(pidof find)/cwd

28
2017-12-15 08:48



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


Ein kleines Dienstprogramm namens pv (Pfeifenviewer) kann Hilfe. Von dem fantastische Zusammenfassung von Peteris Krumins:

Pipe Viewer ist ein terminalbasiertes Tool zur Überwachung des Fortschritts von Daten in einer Pipeline.

Sie können pv auf verschiedene Arten verwenden. Wenn ich hier rumspiele, lege ich es sofort nach einer Pipe ab, um den Fortschritt der von find erzeugten Ausgabe zu überwachen (sollte Stdin unverändert zu Standout übergeben)

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

Das zeigt eine Ausgabe wie folgt:

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

(Ich habe stdout nach / dev / null umgeleitet, damit ich den Fortschrittsbalken in Aktion sehen konnte, ohne dass die Ausgabe vorbeifliegt. Das ist wahrscheinlich nicht deine Absicht mit find, also schneiere entsprechend)

Ich bin mir ehrlich gesagt nicht sicher, wie gut das in der Wildnis funktioniert. Bei "teuren" Funden wie dem oben genannten (von der Wurzel ausgehend) schien es ziemlich gut zu funktionieren. Für einfachere Befehle in einem tieferen Knoten in der Verzeichnisstruktur ist pv kläglich gescheitert. Diese Befehle geben die Ergebnisse sofort zurück, daher ist hier wahrscheinlich ein Fortschrittsbalken erforderlich.

Auf jeden Fall, spielen Sie herum und sehen Sie, ob dies überhaupt für das, was Sie brauchen, funktioniert. Zum Nachdenken zumindest.


7
2017-12-15 09:54



Was würde diese Fortschrittsanzeige zeigen? Weder find, Noch pv wissen, wie lange die Suche dauert, damit sie den Prozentsatz nicht berechnen können. Alles, was wir in der sehen können pv Ausgabe ist die Zeit seit Beginn der Suche. - minaev
Das ist richtig. Ich hatte geglaubt, dass irgendwo Magie im Gange war, die es pv erlaubte, den Fortschritt des Verzeichnisdurchlaufs zu überprüfen (was inkorrekt ist). Bei Standardeingabe mit konstanter Rate, pv Bewegt einfach den Fortschrittsbalken mit einer konstanten Frequenz. Versuchen yes | pv > /dev/null beobachten - tcdyl
+1 für ein nettes Dienstprogramm - Vlad Balmos
Die Beurteilung des Fortschritts ist nicht trivial. Nicht einmal das Laden von Seiten durch Webbrowser ist dazu in der Lage. Ich denke, für Dateiinhalte können Sie durch die Dateigröße teilen, aber für Unix-Streams wissen Sie nicht die Gesamtmenge der Daten ist normalerweise, und dieses Tool soll für jede Art von Stream-Daten, nicht nur Dateien flexibel sein. - Sridhar-Sarnobat


Ich habe heute danach gesucht und bin über Google hierher gekommen. Ich hatte einen lang laufenden Fund auf OS X und anscheinend watch existiert dort nicht. 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 dies, wenn Sie das vollständige Zeichen bevorzugen lsof Ausgabe
  • -a = erzählen lsof um nur übereinstimmende Zeilen anzuzeigen alles Kriterien (standardmäßig werden übereinstimmende Zeilen angezeigt irgendein Kriterien)
  • -c find = show files / Verzeichnisse, die von process named geöffnet wurden find (eigentlich, Prozess, dessen Name mit beginnt find, aber es ist die Groß- / Kleinschreibung Finder wird nicht angezeigt)
  • -d cwd = Zeige Zeilen mit FD (Dateideskriptor) cwd (aktuelles Arbeitsverzeichnis)
  • +r 10 = Ausgabe alle 10 Sekunden anzeigen, bis keine Dateien gefunden wurden (Suche ist beendet)

Dies zeigt das Verzeichnis an find verarbeitet alle 10 Sekunden, so sollte es eine Idee geben, wenn find funktioniert noch und wie weit ist es fortgeschritten.


5
2018-02-01 16:50





Es gibt ein Beispiel für parallele Suchen mit find im man find. Mit dieser Funktion können Sie mehrere Prüfungen für jedes Element durchführen und je nach der Bedingung mehrere Aktionen ausführen. Die erste Überprüfung kann zum Beispiel einfach sein-print, also werden alle Namen auf Standard gedruckt. Der zweite Check wird tun, was Sie wollen. So etwas wie:

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

Wenn die zweite Überprüfung auch Dateinamen anzeigen soll, können Sie eine davon mit stderr umleiten -fprint /dev/stderr.


4
2017-12-15 09:47





AFAIK, es nicht, und die Umsetzung wäre nicht-trivial.

... Hmm. Vielleicht läuft ein Skript find <target dir> -type d Speichern Sie zuerst die Liste und wiederholen Sie dann jedes Verzeichnis, bevor Sie a ausführen find <list item> -maxdepth 1 <rest of find parameters> in einer for-Schleife.

Beachten Sie, dass Sie einen / signifikanten / Verlust der Leistung im Austausch für die vage sehen, was es tut handeln.


2
2017-12-15 08:24





Dies ist eine Liste der aktuellen Dateien, die von geöffnet werden findenAlso ist es das Gleiche finden schaut gerade "gerade".

Sein Leichtgewicht als nur Abfrageadresse von Dateibeschreibungen von verwendet finden  jede Sekunde und interferieren nicht finden selbst. Sie können es auch mit jedem beliebigen Programm machen.

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

Das grep -v /dev/ besteht darin, die Dateien STDOUT, STDIN und STDERR auszublenden, bei denen es sich um Dateien handelt, die zum Empfangen und Drucken von Daten auf Ihrer Konsole verwendet werden.


1
2018-03-21 02:21