Para cada archivo coincidente (es decir, cada directorio), find
cambia al directorio que lo contiene (es decir, su directorio padre) y ejecuta el comando especificado. Como el comando no usa el nombre de la coincidencia, nunca actuará en todos los directorios. Para este árbol de directorios en particular, estás haciendo
(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 crear un archivo en cada directorio, simplemente puede usar en -exec
lugar de -execdir
, siempre que su implementación de find
permisos {}
dentro de un argumento (la mayoría lo hace, y en particular creo que todos):
find . -type d -exec touch {}/foo +
Para la portabilidad POSIX, deberá ensamblar el nombre del directorio y el nombre base del archivo manualmente.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
o (un poco más rápido)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Alternativamente, puede usar la coincidencia de comodines recursiva de bash. Tenga en cuenta que (a diferencia de la función correspondiente en ksh y zsh, y a diferencia de su find
comando) bash se repite bajo enlaces simbólicos a los directorios.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Una solución zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
estados bajo "-c": los argumentos después de command_string se asignan a los parámetros posicionales que comienzan con $ 0, sin embargo, "for d" iterará a través de los parámetros posicionales que comienzan con $ 1. "_" es texto asignado a $ 0 y no se utilizará.