Когда 'найдет. - исполнительная КОМАНДА {} +' выполняют КОМАНДУ многократно?

Вы могли использовать ожидать инструмент для запущения программ в VM. expect программа, которая использует Tcl, поскольку это - язык сценариев и расширяет язык немного. Это было долго, так как я использовал expect, но я вспоминаю это являющийся небольшим inobvious до, как получить некоторые вещи произойти. Это действительно имело возможность случайного интервала синхронизации "ввода" сделанного моделируемым человеком, таким образом, это может быть, что Вы хотите.

8
29.08.2014, 06:09
2 ответа

Определение POSIX найти -exec имя_утилиты [аргумент ...] {} + как:

Окончание первичного выражения должно быть препиначено точкой с запятой. или с помощью <плюс-знака>. Только , который следует сразу за аргумент, содержащий только два символа "{}", должен содержать знаки "{}". конец первичного выражения. Другие виды использования не должны рассматриваться как особенный. Если первичное выражение пунктуатировано < точка с запятой>, утилита utility_name должна вызываться один раз для каждой патнан и первичный должны быть оценены как истинные, если утилита возвращает нулевое значение как статус выхода. Имя_утилиты или аргумент , содержащий только два символа "{}" должны быть заменены на текущий Отчество. Если строка utility_name или argument содержит два параметра иероглифы "{}", но не просто два иероглифа "{}", а определяет, заменит ли эти два символа или же использует строку без изменений.

Если первичное выражение препинается знаком , то первичное выражение всегда будут оцениваться как истинные, и отчество, для которого первичное оценивается в совокупности. Имя_утилиты utility_name. вызывается один раз для каждого набора обобщенных отчеств. Каждый Зазыв должен начинаться после того, как последним именем в наборе будет обобщены и должны быть завершены до того, как найдет выходы из коммунальных служб, и до того, как первый путь в следующем наборе (если таковой имеется) будет объединен за этот первичный, но в остальном не определено, будет ли вызов происходит до, во время или после оценки других праймериз. Если любой вызов возвращает ненулевое значение в качестве состояния выхода, find. утилита должна вернуть ненулевой статус выхода. Аргумент, содержащий только два символа "{}" должны быть заменены на набор из агрегированные патнамы, каждый из которых передается в качестве отдельного аргумента. к вызываемой утилите в том же порядке, в котором она была объединена. размер любого набора из двух или более отчеств должен быть ограничен таким образом, чтобы выполнение утилиты не приводит к ограничению системы {ARG_MAX} превысить . Если более одного аргумента, содержащего два Символы "{}" присутствуют, поведение не определено.

Если найденный набор длины имени файла превышает системный ARG_MAX, команда выполняется.

Вы можете получить ARG_MAX, используя getconf:

$ getconf ARG_MAX
2097152

На некоторых системах фактическое значение ARG_MAX может отличаться, для получения более подробной информации обратитесь к здесь .

7
27.01.2020, 20:10

В POSIX-системе существует максимальная длина списка аргументов для нового процесса. find разбивает выполнение, если пути к файлам длиннее этого. Чтобы увидеть ограничение на Linux, используйте xargs --show-limits (не работайте в Mac OS, если кто-то знает лучшую альтернативу, пожалуйста, прокомментируйте здесь)

edit: украдено прямо из ответа Gnouc, POSIX способ получить максимальную длину списка аргументов - getconf ARG_MAX. Однако, я провел эксперимент на своей машине mac os, и похоже, что find использует чуть больше половины этого числа. Это согласуется с тем, что на системе, где она работает, xargs --show-limits говорит нам, что она не будет использовать максимальную длину аргумента (в данном случае она также будет использовать около половины этого числа), однако я не смог найти объяснения этому.

edit 2: кажется, что единственный надежный способ определить, сколько параметров find будет слипаться для каждого вызова - это экспериментировать, например, запуская

find / -exec echo {} + | wc -cl

Так как выход из find имеет строку для каждого вызова echo, их можно сосчитать, используя wc -l. Общее количество байтов echoed является выходом wc -c вместо этого. Делясь один на другой, Вы получаете среднее количество байт в параметрах для каждого вызова команды (хотя и немного меньшее значение, из-за округления, примерно половину средней длины пути в Вашей системе)

.
7
27.01.2020, 20:10

Теги

Похожие вопросы