Я нахожу, что объяснение в руководстве find
немного неясно.
Что означает фраза «но командная строка создается путем добавления каждого выбранного файла в конец; общее количество вызовов команды будет намного меньше количества соответствующих файлов» Почему так?
Ниже приведен текстman find
-exec команда {} +
Этот вариант действия
-exec
запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конец; общее количество вызовов команды будет намного меньше количества соответствующих файлов. Командная строка создается примерно таким же образом, как иxargs
ее командные строки. В команде допускается только один экземпляр '{}'. Команда выполняется в начальном каталоге.
решение1
Что означает фраза «но командная строка создается путем добавления каждого выбранного файла в конец; общее количество вызовов команды будет намного меньше количества соответствующих файлов» Почему так?
Давайте создадим несколько примеров файлов:
touch {1..5}.txt
Сначала давайте выполним команду find:
$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt
Как вы можете видеть, {}
заменяется списком всех find
найденных файлов. В этом примере у нас есть шесть соответствующих файлов, но echo
запускается только один раз.
Обратите внимание, что оболочки имеют ограничение на количество символов, которые они принимают в одной командной строке. find
знает это и, если файлов слишком много для размещения в одной командной строке, find
будет запускаться echo
несколько раз с разными файлами, пока не будут обработаны все имена файлов. Вот почему «количество вызовов команды будет намного меньше количества соответствующих файлов».
Давайте проверим это, создав множество файлов в нашем каталоге:
touch this_is_a_long_file_name{1..10000}.txt
Теперь давайте выполним команду поиска:
$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line
Как видите, несмотря на то, что в этом каталоге было более 10 000 файлов, команда exec была запущена всего три раза.