Я получаю следующую ошибку при попытке в ls *.txt | wc -l
каталог, который содержит много файлов:
-bash: /bin/ls: Argument list too long
Зависит ли порог этого «списка аргументов» от спецификаций дистрибутива или компьютера? Обычно я бы передавал результат такого большого результата некоторым другим командам ( wc -l
например), поэтому меня не касаются ограничения терминала.
ls
вывода «s , что это плохая идея, так что лучше избегать. Для подсчета см. Какой лучший способ подсчитать количество файлов в каталоге? , для хитрого обходного пути посмотрите, почему цикл for не вызывает ошибку «слишком длинный аргумент»? ,Ответы:
Ваш список аргументов сообщения об ошибке слишком длинный исходит от * of
ls *.txt
.Эти ограничения безопасны как для бинарных программ, так и для вашего ядра. На этой странице вы увидите больше информации об этом, а также о том, как он используется и вычисляется.
Там нет такого ограничения на размер трубы. Таким образом, вы можете просто выполнить эту команду:
NB. В современном Linux странные символы в именах файлов (например, переводы строк) будут экранированы такими инструментами, как
ls
илиfind
, но все равно будут отображаться из * . Если вы работаете на старом Unix, вам понадобится эта командаNB2: Мне было интересно, как можно создать файл с новой строкой в его имени. Это не так сложно, если вы знаете хитрость:
источник
-maxdepth 1
если вы не собираетесь считать файлы в подкаталогах.-exec echo \;
.find
. Наfind
OS X и на системах busybox, и я предполагаю, что любая система на основе BSD показывает имя файла с новой строкой в нем, что может привести к путанице с количеством.wc -l
считает новые строки. Поэтому мы хотим, чтобы в нем были новые строки.Это зависит главным образом от вашей версии ядра Linux.
Вы должны увидеть ограничение для вашей системы, запустив
где указано максимальное количество байтов, которое может иметь командная строка после расширения оболочкой.
В Linux <2.6.23 ограничение обычно составляет 128 КБ.
В Linux> = 2.6.25 ограничение составляет 128 КБ или 1/4 размера стека (см.
ulimit -s
), В зависимости от того, что больше.Смотрите man-страницу execve (2) для всех деталей.
К сожалению, трубопровод
ls *.txt
не решит проблему, потому что ограничение находится в операционной системе, а не в оболочке.Оболочка расширяется
*.txt
, затем пытается вызватьи у вас есть столько подходящих файлов,
*.txt
что вы превышаете ограничение в 128 КБ.Вам придется сделать что-то вроде
вместо.
(И см. Комментарии Шона Дж. Гоффа ниже об именах файлов, которые содержат переводы строк.)
источник
.
и что-maxdepth 1
в последней строке? Спасибо! : D.
означает текущий каталог,-maxdepth 1
означает, что он не выглядит в подкаталогах. Это должно было соответствовать тем же файлам, что и*.txt
.Другой обходной путь:
Несмотря на то, что
ls
выводит больше данных, чемls *.txt
производит (или пытается произвести), он не сталкивается с проблемой «слишком длинный аргумент», потому что вы не передаете никаких аргументовls
. Обратите внимание, чтоgrep
требуется регулярное выражение, а не шаблон сопоставления файлов.Вы можете использовать:
(при условии, что ваша версия
ls
поддерживает эту опцию). Это говоритls
не сортировать вывод, что может сэкономить время и память - и в этом случае порядок не имеет значения, так как вы просто считаете файлы. Ресурсы, потраченные на сортировку выходных данных, обычно незначительны, но в этом случае мы уже знаем, что у вас очень большое количество*.txt
файлов.И вам следует подумать о реорганизации ваших файлов, чтобы их не было так много в одном каталоге. Это может или не может быть осуществимо.
источник
MAX_ARG_PAGES представляется параметром ядра. Использование
find
иxargs
является типичной комбинацией для преодоления этого ограничения, но я не уверен, что это сработаетwc
.Передача выходных данных
find . -name \*\.txt
в файл и подсчет строк в этом файле должны использоваться в качестве обходного пути.источник
ls
выводом, не решите это. До тех пор, пока подстановочный знак * .txt не будет превышен лимит, произойдет сбой даже до запускаls
и генерации какого-либо вывода.ls
вы должны указать,-maxdepth 1
чтобы избежать рекурсивного сканирования подкаталогов.Это может быть грязно, но это работает для моих нужд и в пределах моей компетенции. Я не думаю, что это работает очень быстро, но это позволило мне продолжить мой день.
Я получал список из 90000 jpgs и отправлял их в avconv, чтобы создать интервал времени.
Ранее я использовал ls * .jpg | avconv, прежде чем я столкнулся с этой проблемой.
источник