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

Einen Befehl ausführen, wo eine Datei gefunden wird?

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 .


Linux
  1. mkfs.hfsplus:Befehl nicht gefunden

  2. nano:Befehl nicht gefunden

  3. Sortieren:Befehl nicht gefunden

  4. ln:Befehl nicht gefunden

  5. sed:Befehl nicht gefunden

tune2fs:Befehl nicht gefunden

fsck:Befehl nicht gefunden

tail:Befehl nicht gefunden

rm:Befehl nicht gefunden

touch:Befehl nicht gefunden

mv:Befehl nicht gefunden