GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie führe ich mehrere Befehle aus, wenn ich find verwende?

In dieser Demonstration verwende ich sh -c 'echo first; false' (oder true ) für die ersten -exec . Das gibt etwas Ausgabe und hat auch den ausgewählten Exit-Code-Effekt. Dann echo second wird für den zweiten verwendet. Angenommen, es gibt eine Datei im aktuellen Verzeichnis.

$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second

Ein echter Befehl dieses Typs würde wie folgt aussehen:

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)

Im zweiten Satz gruppieren die Klammern mit Escapezeichen die beiden -exec Klauseln. Die -false zwischen ihnen zwingt den Teststatus auf "false" und den -o bewirkt den nächsten Ausdruck (das zweite -exec ) wegen -false ausgewertet werden .

Ab man find :

Ausdruck1 Ausdruck2
Zwei aufeinanderfolgende Ausdrücke werden mit einem implizierten "und" verbunden; expr2 wird nicht ausgewertet, wenn expr1 falsch ist.

Ausdruck1 -ein Ausdruck2
Dasselbe wie expr1 expr2.

Ausdruck1 -o Ausdruck2
Oder; expr2 wird nicht ausgewertet, wenn expr1 wahr ist.


Wenn es Ihnen egal ist, dass cmd1 aufgrund des Fehlercodes 0 verhindern kann, dass cmd2 ausgeführt wird :

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

Der einzig zuverlässige Weg, beide Befehle dazu zu bringen, dies immer auszuführen, ist find Rufen Sie eine Shell auf, die anschließend die Befehle der Reihe nach ausführt:

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

Wenn es Ihnen nichts ausmacht, ein Skript zu erstellen, das cmd1 und cmd2 ausführt, dann ist es nur das:

find . -exec myscript {} \;

oder

find . -exec myscript {} +

Verwenden \; oder +, je nachdem, ob myscript mehr als eine Datei gleichzeitig verarbeiten kann (wird haarig, wenn Leerzeichen in Dateinamen usw. vorkommen).

Meiner Erfahrung nach hat es sich fast immer gelohnt, das, was Sie getan haben, in ein Drehbuch zu schreiben. Wenn Sie es einmal tun müssen, müssen Sie es erneut tun.

Aber ein netter Trick besteht darin, den Fund innerhalb zu platzieren das Skript:

if [ $# -gt 0 ]; then
    for each; do
        touch $each
    done
else
    find . -exec $0 {} +
fi

Dann arbeitet myscript an allen Dateien, die Sie als Argumente für die Arbeit angeben, aber wenn Sie ihm keine Argumente geben, führt es find aus dem aktuellen Verzeichnis aus und ruft sich dann selbst für die gefundenen Dateien auf. Dies umgeht die Tatsache, dass find -exec keine Shell-Funktionen aufrufen kann, die Sie in Ihrem Skript definiert haben.


Linux
  1. Wie sende ich Stdout an mehrere Befehle?

  2. Wie finde ich mehrere Zeichenfolgen in Dateien?

  3. So konfigurieren Sie Nginx zum Ausführen von PHP mit PHP-FPM

  4. Suchen und kopieren Sie die Datei mit Bash

  5. So kopieren Sie mehrere Dateien gleichzeitig mit scp

So führen Sie Linux-Befehle auf einem Remote-System über SSH aus

So finden Sie Dateien über die Befehlszeile im Linux-Terminal

So zeigen Sie Cheatsheets für Linux-Befehle mit z

So bearbeiten Sie mehrere Dateien mit dem Vim-Editor

So steuern Sie Vagrant Box mit Vagrant-Befehlen

Wie lösche ich mehrere Ordner parallel?