Wie führe ich einen Befehl aus, wenn eine Datei gefunden wird?
Stellen Sie sich vor, ich habe ein Verzeichnis namens testdir
die Folgendes enthält:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf
Jetzt möchte ich eine Aktion ausführen (einen Befehl ausführen), wo find
findet eine bestimmte Datei/Dateityp. Lassen Sie mich zum Beispiel *.pdf
suchen :
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Angenommen, ich möchte einen Befehl ausführen (sagen Sie zum Beispiel touch file
), wo der obige Befehl Dateien findet. Mit anderen Worten, ich möchte eine Datei mit dem Namen file
erstellen in jedem Verzeichnis wo mindestens eine .pdf
wurde gefunden, sodass ich bekomme:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf file
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf file
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf file
Wie führe ich eine solche Arbeit durch?
Kann für jede gefundene Datei cd
sein dorthin, wo die Datei existiert, und einen Befehl rekursiv ausführen.
Ich weiß, dass find
hat ein tolles Feature:-exec
aber ich kann es nicht zum Laufen bringen.
Dies ist nur ein Beispiel, um eine Vorstellung davon zu bekommen, was ich tun möchte. Grob gesagt:Wie man einen Befehl ausführt, wo Datei(en) gefunden werden (durch find
) rekursiv?
Akzeptierte Antwort:
Wenn Sie diesen Befehl ausführen, wird Ihre touch file
aus dem Verzeichnis, in dem der Befehl gestartet wurde, ggf. mehrfach ausgeführt:
find -name '*.pdf' -exec touch file ;
Wenn Sie dagegen diese Variante ausführen, wird jede Instanz des Befehls im Verzeichnis der Zieldatei ausgeführt:
find -name '*.pdf' -execdir touch file ;
In beiden Fällen können Sie dies in Aktion sehen, indem Sie die touch file
ersetzen entweder mit echo {}
und/oder pwd
.
Von der Manpage:
-execdir command ;
-execdir command {} +
- Wie
-exec
, aber der angegebene Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält, was normalerweise nicht das Verzeichnis ist, in dem Sie find
gestartet haben .