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á.El comando se ejecuta en cada directorio que contiene un archivo coincidente. Como
c
no contiene un directorio, no coincide y, por lo tanto, no se ejecutará allí.La solución es agregar el nombre del directorio al argumento execdir, así:
fuente
Desde
man file
Su directorio coincidente
c
vive en elb
directorio, de modo que es donde se ejecuta el ejecutivo. Funcionaría como espera si busca archivos en lugar de directorios.Probablemente podría lograr lo que desea enviando los directorios,
xargs
ya que se le proporcionará la lista completa de directorios.fuente