it-swarm.com.de

Gibt es mit find mit -exec {} eine Möglichkeit, die Gesamtsumme zu zählen?

Ich verwende einen Befehl ähnlich diesem:

find . -name "*.php" -exec chmod 755 {} \;

Obwohl ich kein chmod verwende, verwende ich einen anderen Befehl, den ich hier nicht auflisten möchte. Dieser Befehl funktioniert einwandfrei. Es gibt jedoch Tausende von Dateien und Verzeichnissen, die bearbeitet werden müssen, und dieser Vorgang dauert einige Zeit. Ich frage mich, ob es eine Möglichkeit gibt, eine Art Summe anzuzeigen, wenn der Vorgang abgeschlossen ist? Vielleicht eine Anzahl modifizierter Dateien?

Das einzige, was mir einfällt, ist einfach etwas zu tun:

find . -name "*.php" -exec chmod 755; echo "+"; {} \;

Wird es funktionieren? Zumindest können wir sehen, dass etwas passiert ... Hat jemand einen besseren Vorschlag?

35
ethanpil

Das funktioniert:

$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l

Sie müssen einen zweiten -exec /bin/echo angeben, damit dies funktioniert. Wenn der Befehl find keine Ausgabe hat, hat wc keine Eingabe, um die Zeilen zu zählen.

34
David W.

Sie können mehrere -exec-Befehle mit einem einzigen Suchbefehl verketten. Die Syntax dafür lautet:

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;

was in Ihrem Fall so aussehen würde:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;

Obwohl Sie noch einige andere Optionen haben. Sie können die Ausgabe in eine Datei umleiten:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt

Oder Sie können tee verwenden, mit dem Sie die Ausgabe in eine Protokolldatei schreiben können, und still auf dem Bildschirm. Ich finde das nützlich, da die fortlaufend gestreamte Ausgabe auf dem Bildschirm mich darüber informiert, dass der Befehl noch ausgeführt wird (nicht abgestürzt oder blockiert), und ich immer noch die Protokolldatei habe, auf die ich mich später beziehen kann.

find . -name '*.php' -exec chmod 755 {} \; | tee logfile.txt
wc -l logfile.txt           // prints the lines in the file
grep -c '^+$' logfile.txt   // prints the lines containing a single '+'
9
Tim
find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c

Wenn Sie + anstelle von ";" verwenden, versucht find, chmod 755 für viele Dateien parallel zu verarbeiten. 

Sie können nach dem ersten Befehl weitere Befehle ausführen, beispielsweise einen Punkt drucken und am Ende die Punkte zählen.

2
user unknown

Mit der Option -exec startet find einen Unterprozess für jede gefundene Datei. Sie können dies beschleunigen, indem Sie xargs wie find . -name '*.php' | xargs chmod 755 verwenden - chmod wird nur einmal gestartet.

0
ott--

Sie könnten xargs und pv verwenden. Möglicherweise:

find . -name "*.php" | pv --line-mode | xargs chmod 755

Hinweis: Dies funktioniert nur, wenn Ihre * .php-Dateien keine Leerzeichen oder andere ungerade Zeichen im Pfad oder Namen enthalten. 

0
James Sumners