Wie führe ich einen Befehl aus, bei dem eine Datei gefunden wird?
Angenommen, ich habe ein Verzeichnis mit dem Namen testdir
:
$ 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), bei der find
eine bestimmte Datei / ein bestimmter Dateityp gefunden wird. Lassen Sie mich zum Beispiel finden *.pdf
:
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Angenommen, ich möchte einen Befehl ausführen (z. B. touch file
), in dem der obige Befehl Dateien findet. Mit anderen Worten, ich möchte eine Datei mit dem Namen file
in jedem Verzeichnis erstellen, in dem mindestens eine .pdf
gefunden wurde, damit ich Folgendes erhalte:
$ 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 mache ich eine solche Arbeit?
Kann für jede gefundene Datei sein, cd
wo Datei vorhanden ist und einen Befehl rekursiv ausführen.
Ich weiß, dass das find
eine großartige Funktion hat: -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. Allgemein: Wie führe ich einen Befehl aus, bei dem Dateien find
rekursiv gefunden werden?
-execdir
dazu.Antworten:
Wenn Sie diesen Befehl
touch file
ausführen, wird Ihr Befehl möglicherweise mehrmals in dem Verzeichnis ausgeführt, in dem der Befehl gestartet wurde:Wenn Sie diese Variante ausführen, wird jede Instanz des Befehls im Verzeichnis der Zieldatei ausgeführt:
In beiden Fällen können Sie dies in Aktion sehen, indem Sie das
touch file
durch entwederecho {}
und / oder ersetzenpwd
.Von der Manpage:
quelle
Sie können das Verzeichnis des Dateinamens mit extrahieren
dirname
und von dort übernehmen.wobei die Datei
myscript
Folgendes enthält:quelle
file
nur in einem Ordner erstellt, den es zuerst findetMit können
zsh
Sie Glob-Qualifizierer verwenden, um z. B. nur.pdf
Dateien auszuwählen , und über Modifikatoren die Verzeichnisnamen in einem Array mit eindeutigen Elementen und danncd
in jedem dieser Verzeichnisse speichern und Ihren Befehl ausführen. Auf diese Weise führen Sie Ihren Befehl nur einmal in jedem Verzeichnis aus, unabhängig von der Anzahl der.pdf
in diesem Verzeichnis gefundenen s:oder
Sie können Modifikatoren und Qualifizierer weiter kombinieren, z. B. um nach regulären Dateien (versteckt und nicht versteckt) mit der Erweiterung zu suchen
.bkp
und eindeutige Verzeichnisnamen in einem Array zu speichern:quelle
Suchen Sie nicht weiter als entr:
https://bitbucket.org/eradman/entr
Sie können entr ein bestimmtes Verzeichnis überwachen lassen. Wenn find die Datei findet, berühren Sie eine Datei mit dem Namen triggerfile.txt in diesem Verzeichnis und lassen Sie entr übernehmen.
quelle