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.