Para cada arquivo correspondente (ou seja, todos os diretórios), 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, ele 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 -exec
em vez de -execdir
, desde que sua implementação de find
permita {}
dentro de um argumento (a maioria faz e, em particular, acho que todos ):
find . -type d -exec touch {}/foo +
Para portabilidade POSIX, você precisaria fazer a montagem do nome do diretório e o 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. Cuidado (ao contrário do recurso correspondente em ksh e zsh, e ao contrário do comando find
) bash recursiva 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'\')