Для каждого соответствующего файла (т. Е. Каждого каталога) 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' _ {} +
Кроме того, вы можете использовать рекурсивное сопоставление с подстановочными знаками в bash. Помните, что (в отличие от соответствующей функции в ksh и zsh и в отличие от вашей find
команды) 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 и не будет использоваться.Команда выполняется в каждом каталоге, который содержит соответствующий файл. Поскольку
c
каталог не содержит, он не совпадает и, следовательно, не будет работать там.Решением является добавление имени каталога в аргумент execdir, например так:
источник
Из
man file
Ваш соответствующий каталог
c
вb
каталоге, так что отсюда запускается exec. Это будет работать, как вы ожидаете, если вы ищете файлы вместо каталогов.Вы, вероятно, могли бы достичь того, чего хотите, отправив каталоги, так
xargs
как при этом будет предоставлен полный список каталогов.источник