Как строится командная строка для команды find -exec {} +

Как строится командная строка для команды find -exec {} +

Я нахожу, что объяснение в руководстве 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 была запущена всего три раза.

Связанный контент