Максимальное количество аргументов Bash! = Max num cp аргументов? - PullRequest
28 голосов
/ 15 ноября 2010

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

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

$ getconf ARG_MAX

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

2621440

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

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

Ответы [ 2 ]

27 голосов
/ 15 ноября 2010

Как сказал Игнасио, 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).

7 голосов
/ 15 ноября 2010

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

...