Wechselt für jede übereinstimmende Datei (dh jedes Verzeichnis) find
zu dem Verzeichnis, in dem sie enthalten ist (dh zu dem übergeordneten Verzeichnis), und führt den angegebenen Befehl aus. Da der Befehl nicht den Namen der Übereinstimmung verwendet, wird er niemals auf alle Verzeichnisse angewendet. Für diesen bestimmten Verzeichnisbaum tun Sie dies
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Um eine Datei in jedem Verzeichnis zu erstellen, können Sie einfach -exec
anstelle von verwenden -execdir
, vorausgesetzt, Ihre Implementierung find
erlaubt {}
innerhalb eines Arguments (die meisten tun dies, und insbesondere denke ich, alle):
find . -type d -exec touch {}/foo +
Für die POSIX-Portabilität müssten Sie den Verzeichnisnamen und den Dateibasisnamen manuell zusammenstellen.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
oder (etwas schneller)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Alternativ können Sie den rekursiven Platzhalterabgleich von bash verwenden. Beachten Sie, dass find
Bash (im Gegensatz zu den entsprechenden Funktionen in ksh und zsh und im Gegensatz zu Ihrem Befehl) unter symbolischen Links zu Verzeichnissen wiederkehrt.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Eine zsh-Lösung:
touch ./**/(e\''REPLY+=foo'\')
man bash
Ihrer Information : Zustände unter "-c": Argumente nach "command_string" werden Positionsparametern ab $ 0 zugewiesen, "for d" durchläuft jedoch Positionsparameter ab $ 1. "_" ist Text, der $ 0 zugewiesen ist und nicht verwendet wird.Der Befehl wird in jedem Verzeichnis ausgeführt, das eine übereinstimmende Datei enthält. Da
c
es kein Verzeichnis enthält, stimmt es nicht überein und wird daher dort nicht ausgeführt.Die Lösung besteht darin, den Verzeichnisnamen wie folgt zum execdir-Argument hinzuzufügen:
quelle
Von
man file
Ihr passendes Verzeichnis befindet sich
c
in demb
Verzeichnis, in dem die Exec ausgeführt wird. Es würde wie erwartet funktionieren, wenn Sie nach Dateien statt nach Verzeichnissen suchen.Sie könnten wahrscheinlich erreichen, was Sie wollen, indem Sie die Verzeichnisse an senden,
xargs
da die vollständige Liste der Verzeichnisse geliefert wird.quelle