Я прочитал здесь, что вы можете посчитать количество вызовов command
в -exec command {} +
, отправив по трубке | wc -l
до конца.
Хотя я понимаю, что -execdir
это отличается, в том, что для каждого соответствующего подкаталога, который find
обнаруживает, он запускает вызов command
из подкаталога, в котором он содержится, если у меня более одного файла, который совпадает в подкаталоге, я в итоге получаю количество вызовов, равное количеству соответствующих подкаталогов, а не количество вызовов, соответствующих количеству соответствующих файлов в этих подкаталогах?
Я заканчиваю с последним, когда я запускаю следующее:
$ find . -name "bob*" -execdir echo {} + | wc -l
Страница справочника для execdir command {} +
государств заявляет, что первое должно иметь место:
Как и в случае с
-exec
действием, в+
форме-execdir
будет создана командная строка для обработки более одного сопоставленного файла, но при любом вызове изcommand
этого списка будут перечислены только файлы, которые существуют в одном подкаталоге.
т.е.
Я получаю:
./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3
Когда я ожидаю этого, основываясь на справочной странице:
./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
echo
и аргументы генерируются,{} +
а у вас нет новых строк в именах файлов (большинство людей этого не делают), ТОГДА число строк - это количество вызовов, и это работает. Если команда говорит,head -n 999000 /dev/urandom
это идет ужасно неправильно.Ответы:
Это проблема производительности
find
. Вfindutils
версии 4.3.4 обходной путь должен был ограничить число аргументов, которые-execdir ... {} +
будут использовать 1. В версии 4.5.9 ограничение было снято.Смотрите пример:
При
-execdir {} +
этом команда должна быть выполнена 3 раза. Второй вызов должен иметь 3 аргумента.С
find
4.4.2:С
find
4.6.0:источник