Pour chaque fichier correspondant (c'est-à-dire chaque répertoire), find
bascule vers le répertoire qui le contient (c'est-à-dire son répertoire parent) et exécute la commande spécifiée. Puisque la commande n'utilise pas le nom de la correspondance, elle n'agira jamais sur tous les répertoires. Pour cette arborescence de répertoires particulière, vous faites
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Pour créer un fichier dans chaque répertoire, vous pouvez simplement utiliser à la -exec
place de -execdir
, à condition que votre implémentation de find
permet à l' {}
intérieur d'un argument (la plupart le font, et en particulier je pense que tous):
find . -type d -exec touch {}/foo +
Pour la portabilité POSIX, vous devez effectuer manuellement l'assemblage du nom du répertoire et du nom de la base de fichiers.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
ou (légèrement plus rapide)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Vous pouvez également utiliser la correspondance récursive générique de bash. Attention (contrairement à la fonctionnalité correspondante dans ksh et zsh, et contrairement à votre find
commande) bash revient sous des liens symboliques vers des répertoires.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Une solution zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
états sous "-c": les arguments après chaîne_commande sont assignés aux paramètres positionnels commençant par $ 0, cependant "for d" parcourra les paramètres positionnels commençant par $ 1. "_" est un texte affecté à $ 0 et qui ne sera pas utilisé.