Когда я запускаю команду вроде ls */*/*/*/*.jpg
, я получаю ошибку
-bash: /bin/ls: Argument list too long
Я знаю, почему это происходит: это потому, что в ядре есть ограничение на количество места для аргументов команды. Стандартный совет - изменить команду, которую я использую, чтобы не требовалось слишком много места для аргументов (например, use find
and xargs
).
Что если я не хочу менять команду? Что делать, если я хочу продолжать использовать ту же команду? Как я могу заставить вещи "просто работать", не получая эту ошибку? Какие решения доступны?
Ответы:
В Linux максимальный объем пространства для аргументов команды составляет 1/4 от объема доступного стекового пространства. Таким образом, решение состоит в том, чтобы увеличить объем пространства, доступного для стека.
Короткая версия: запустить что-то вроде
Более длинная версия: объем пространства по умолчанию, доступный для стека, составляет около 8192 КБ. Вы можете увидеть количество доступного пространства следующим образом:
Выберите большее число и установите объем пространства, доступного для стека. Например, если вы хотите попробовать выделить до 65536 КБ для стека, выполните следующее:
Возможно, вам придется поэкспериментировать с тем, насколько большим это должно быть, используя метод проб и ошибок. Во многих случаях это быстрое и грязным решение , которое устранит необходимость изменения команды и работы из синтаксиса
find
,xargs
и т.д. (хотя я понимаю , что есть и другие преимущества для этого).Я считаю, что это специфично для Linux. Я подозреваю, что это, вероятно, не поможет в любой другой операционной системе Unix (не проверено).
источник
Эта статья в журнале Linux предлагает 4 решения. Только четвертое решение не предполагает изменения команды:
Я согласен, что ограничение серьезно раздражает.
источник
Вместо того
ls */*/*/*/*.jpg
, чтобы попробовать:xargs
(1) знает, каково максимальное количество аргументов в системе, и будет разбивать ее стандартный ввод для многократного вызова указанной командной строки без аргументов, превышающих это ограничение, независимо от того, какое оно есть (вы также можете установить его ниже, чем максимальная ОС, используя-n
опцию).Например, предположим, ограничение составляет 3 аргумента, и у вас есть пять файлов. В этом случае
xargs
будет выполненоls
дважды:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Часто это идеально подходит, но не всегда - например, вы не можете полагаться на
ls
(1) правильную сортировку всех записей для вас, потому что каждый отдельныйls
-invocation будет сортировать только подмножество записей, данных емуxargs
.Хотя вы можете увеличить лимит, как это предлагают другие, он все равно будет существовать, и однажды ваша JPG-коллекция снова перерастет его. Вы должны подготовить свои сценарии для работы с бесконечным числом ...
источник
Argument list too long
, ноecho
вместо тогоls
, на снарядах , гдеecho
не оболочка встроенной команды? (Может быть, это не проблема в большинстве оболочек, так что, возможно, это не имеет значения.)find
с-print0
предикатом - и труба его выход вxargs
с-0
опцией.echo
является встроенной оболочкой и не страдает от ограничения командной строкиexec
(3).