Для кожного відповідного файлу (тобто кожного каталогу) find
перемикається на каталог, який містить його (тобто його батьківський каталог) і виконує вказану команду. Оскільки команда не використовує назву збігу, вона ніколи не буде діяти у всіх каталогах. Для цього конкретного дерева каталогу ви робите
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Щоб створити файл у кожному каталозі, ви можете просто використовувати -exec
замість цього -execdir
, якщо ваша реалізація find
дозволяє {}
всередині аргументу (більшість з них, і я думаю, що всі):
find . -type d -exec touch {}/foo +
Для перенесення POSIX вам потрібно буде виконати збірку імені каталогу та базового імені файлу вручну.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
або (трохи швидше)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Крім того, ви можете використовувати рекурсивну підстановку підстановок башів. find
Будьте уважні, що (на відміну від відповідної функції в ksh і zsh, і на відміну від вашої команди) bash повторюється під символічними посиланнями на каталоги.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Рішення zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
стани під "-c": аргументи після command_string присвоюються позиційним параметрам, починаючи з $ 0, однак "для d" буде повторюватися через позиційні параметри, починаючи з $ 1. "_" - це текст, який призначається $ 0 і не буде використовуватися.