Максимальное количество аргументов Bash!= Max num cp аргументы?
Недавно я копировал и перемещал большое количество файлов (~ 400 000). Я знаю, что существуют ограничения на количество аргументов, которые могут быть расширены в командной строке Bash, поэтому я использовал xargs для ограничения созданных чисел.
Из любопытства я задавался вопросом, какое максимальное количество аргументов я мог бы использовать, и я нашел этот пост, говоря, что это была система -зависимый, и что я могу запустить эту команду, чтобы узнать:
$ getconf ARG_MAX
К моему удивлению, андерсер, которого я получил, был:
2621440
Только более 2,6 миллиона. Как я уже сказал, количество файлов, которыми я управляю, намного меньше, чем около 400 тыс. Мне определенно нужно использовать метод xargs
для перемещения и копирования этих файлов, потому что я попытался использовать обычный mv * ...
или cp * ...
и получил слишком длинную ошибку "Список аргументов".
Итак, команды mv
и cp
имеют собственный фиксированный предел количества аргументов, которые я могу использовать (я не мог найти что-либо на своих страницах), или я что-то пропустил?
Ответы
Ответ 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)
. Оболочка не требуется для поддержки передачи этой длины аргументов из командной строки.