5

Я нахожу ручное объяснение find немного неясным.

Что означает «но командная строка строится путем добавления каждого выбранного файла в конце; общее количество вызовов команды будет намного меньше, чем количество сопоставленных файлов» Почему это так?

Ниже текст man find

-exec команда {} +

Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка создается так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.

1 ответ1

5

Что означает «но командная строка строится путем добавления каждого выбранного файла в конце; общее количество вызовов команды будет намного меньше, чем количество сопоставленных файлов» Почему это так?

Давайте создадим несколько примеров файлов:

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:

$ 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 запускалась только три раза.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .