Para cada arquivo correspondente (ou seja, todo diretório), find
alterna para o diretório que o contém (ou seja, seu diretório pai) e executa o comando especificado. Como o comando não usa o nome da correspondência, nunca atuará em todos os diretórios. Para esta árvore de diretórios específica, você está fazendo
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Para criar um arquivo em cada diretório, você pode simplesmente usar em -exec
vez de -execdir
, desde que sua implementação de find
permita {}
dentro de um argumento (a maioria faz, e em particular eu acho que todos):
find . -type d -exec touch {}/foo +
Para a portabilidade do POSIX, você precisaria fazer a montagem do nome do diretório e do nome da base do arquivo manualmente.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
ou (um pouco mais rápido)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Como alternativa, você pode usar a correspondência curinga recursiva do bash. Observe que (ao contrário do recurso correspondente em ksh e zsh e ao contrário do seu find
comando) o bash se repete sob links simbólicos para diretórios.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Uma solução zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
estados em "-c": argumentos após command_string são atribuídos a parâmetros posicionais que começam com $ 0, no entanto "for d" irá iterar através de parâmetros posicionais começando com $ 1. "_" é um texto atribuído a $ 0 e não será usado.