Подтвердить что ты не робот

Максимальное количество аргументов Bash!= Max num cp аргументы?

Недавно я копировал и перемещал большое количество файлов (~ 400 000). Я знаю, что существуют ограничения на количество аргументов, которые могут быть расширены в командной строке Bash, поэтому я использовал xargs для ограничения созданных чисел.

Из любопытства я задавался вопросом, какое максимальное количество аргументов я мог бы использовать, и я нашел этот пост, говоря, что это была система -зависимый, и что я могу запустить эту команду, чтобы узнать:

$ getconf ARG_MAX

К моему удивлению, андерсер, которого я получил, был:

2621440

Только более 2,6 миллиона. Как я уже сказал, количество файлов, которыми я управляю, намного меньше, чем около 400 тыс. Мне определенно нужно использовать метод xargs для перемещения и копирования этих файлов, потому что я попытался использовать обычный mv * ... или cp * ... и получил слишком длинную ошибку "Список аргументов".

Итак, команды mv и cp имеют собственный фиксированный предел количества аргументов, которые я могу использовать (я не мог найти что-либо на своих страницах), или я что-то пропустил?

4b9b3361

Ответ 1

Как сказал Игнасио, ARG_MAX - это максимальная длина буфера аргументов, переданных в exec(), а не максимальное количество файлов (эта страница имеет очень подробное объяснение). В частности, он перечисляет fs/exec.c как проверяющее следующее условие:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *) / sizeof(void *)

И, кажется, у вас есть некоторые дополнительные ограничения:

В 32-разрядной версии Linux это ARGMAX/4-1 (32767). Это становится актуальным, если средняя длина аргументов меньше 4. Начиная с Linux 2.6.23, эта функция проверяет, превышает ли число MAX_ARG_STRINGS в <linux/binfmts.h> (2 ^ 32-1 = 4294967296-1). И как дополнительный предел, один аргумент не должен быть длиннее MAX_ARG_STRLEN (131072).

Ответ 2

ARG_MAX - максимальная длина аргументов для функций exec(3). Оболочка не требуется для поддержки передачи этой длины аргументов из командной строки.