Список аргументов слишком долго для ls

Я наконец нашел то, что вызывало проблему. Это происходило из-за моего маршрутизатора, блокирующего сообщения проверки активности TCP, когда я соединился с помощью беспроводных технологий (пойди разберись).

ssh my_server -o TCPKeepAlive=no решенный все мои проблемы. Yay!

Из документации:

TCPKeepAlive
  Specifies whether the system should send TCP keepalive messages
  to the other side. If they are sent, death of the connection or
  crash of one of the machines will be properly noticed.  However,
  this means that connections will die if the route is down tem-
  porarily, and some people find it annoying.  On the other hand,
  if TCP keepalives are not sent, sessions may hang indefinitely on
  the server, leaving "ghost" users and consuming server resources.

  The default is "yes" (to send TCP keepalive messages), and the
  server will notice if the network goes down or the client host
  crashes.  This avoids infinitely hanging sessions.

  To disable TCP keepalive messages, the value should be set to
  "no".
49
31.08.2016, 15:02
5 ответов

Ваш список аргументов сообщения об ошибке слишком долго прибывает из * ls *.txt.

Это ограничивает, безопасность для обеих программ в двоичном представлении и Вашего Ядра. Вы будете видеть на этой странице больше информации об этом, и как она используется и вычисляется.

Нет такого предела на размер канала. Таким образом, можно просто дать эту команду:

find -type f -name '*.txt'  | wc -l

NB: На современном Linux, странных символов в именах файлов (как новые строки) оставят с инструментами как ls или find, но все еще отображенный от *. Если Вы будете на старом Unix, то Вам будет нужна эта команда

find -type f -name '*.txt' -exec echo \;  | wc -l

NB2: Я задавался вопросом, как можно создать файл с новой строкой на ее имя. Дело не в этом трудно, после того как Вы знаете прием:

touch "hello
world"
51
27.01.2020, 19:34
  • 1
    я изменил его немного для работы в случае, когда существуют имена файлов с новыми строками в них. Вы могли бы также хотеть добавить a -maxdepth 1 если Вы не намереваетесь считать файлы в подкаталогах. –  Shawn J. Goff 18.05.2012, 20:25
  • 2
    Вам не нужно -exec echo \;. –  Mikel 18.05.2012, 21:57
  • 3
    @ShawnJ.Goff я протестировал его. Нет никакой потребности 'эха' в текущей версии GNU, находят –  Coren 18.05.2012, 22:51
  • 4
    @Coren @Mikel - не у всех есть GNU find. find на OS X и в находящихся в busybox системах, и я предположил бы, что любая основанная на BSD система показывает имя файла с новой строкой в нем, которая смешала бы с количеством. подпись –  Shawn J. Goff 19.05.2012, 00:01
  • 5
    Ха? wc -l считает новые строки. Таким образом, мы хотим, чтобы это имело новые строки. –  Mikel 19.05.2012, 01:05

Это зависит главным образом от Вашей версии ядра Linux.

Необходимо смочь видеть предел для системы путем выполнения

getconf ARG_MAX

который говорит Вам максимальное количество байтов, командная строка может иметь, будучи расширенным оболочкой.

В Linux <2.6.23, предел обычно - 128 КБ.

В Linux> = 2.6.25, предел составляет или 128 КБ или 1/4 Вашего размера стека (см. ulimit -s), какой бы ни больше.

Посмотрите execve (2) страница справочника для всех подробностей.


К сожалению, передача по каналу ls *.txt движение не должно решать проблему, потому что предел находится в операционной системе, не оболочке.

Оболочка расширяется *.txt, затем попытки звонить

exec("ls", "a.txt", "b.txt", ...)

и у Вас есть столько соответствия файлов *.txt то, что Вы превышаете предел на 128 КБ.

Необходимо будет сделать что-то как

find . -maxdepth 1 -name "*.txt" | wc -l

вместо этого.

(И см. комментарии Shawn J. Goff ниже об именах файлов, которые содержат новые строки.)

11
27.01.2020, 19:34
  • 1
    Извините за не способный к upvote ответ. Нужно больше репутации.:( Спасибо всем!! –   19.05.2012, 06:03
  • 2
    Могли Вы объяснять что . и -maxdepth 1 средний в последней строке?Спасибо! :D –  Guilherme Salomé 27.06.2017, 18:41
  • 3
    @GuilhermeSalomé . текущий каталог средств, -maxdepth 1 средства это не смотрит в подкаталогах. Это было предназначено для соответствия тем же файлам как *.txt. –  Mikel 28.06.2017, 03:33

Другое обходное решение:

ls | grep -c '\.txt$'

Даже при том, что ls производит более вывод, чем ls *.txt производит (или пытается произвести), это не сталкивается с "аргументом слишком долго" проблема, потому что Вы не передаете аргументов ls. Отметьте это grep берет регулярное выражение, а не шаблон соответствия файла.

Вы могли бы хотеть использовать:

ls -U | grep -c '\.txt$'

(принятие Вашей версии ls поддержки эта опция). Это говорит ls для не сортировки его вывода который мог сэкономить и время и память - и в этом случае порядок не имеет значения, так как Вы просто считаете файлы. Потраченная сортировка ресурсов вывода является обычно не значительной, но в этом случае мы уже знаем, что у Вас есть очень большое количество *.txt файлы.

И необходимо рассмотреть реорганизацию файлов, таким образом, у Вас нет так многих в единственном каталоге. Это может или не может быть выполнимо.

9
27.01.2020, 19:34

MAX_ARG_PAGES, кажется, параметр ядра. Используя find и xargs типичная комбинация состоит в том, чтобы обратиться к этому пределу, но я не уверен, что это будет работать на wc.

Передача по каналу вывода find . -name \*\.txt в файл и подсчет строк в том файле должен служить обходным решением.

1
27.01.2020, 19:34
  • 1
    Можно сделать что-либо с lsвывод, не решит это. Пока *.txt подстановочный знак расширен по пределу, перестанет работать перед ровным запуском ls и генерация любого вывода. –  manatwork 18.05.2012, 19:05
  • 2
    Правда, я обновил свой ответ. –  Bram 18.05.2012, 19:11
  • 3
    Лучше. Но сделать это заменой для ls необходимо указать -maxdepth 1 постараться не рекурсивно сканировать подкаталоги. –  manatwork 18.05.2012, 19:19
  • 4
    Извините за не способный к upvote ответ. Нужно больше репутации. :( –   19.05.2012, 06:02

Esto puede estar sucio pero funciona para mis necesidades y dentro de mi competencia. No creo que funcione muy rápido, pero me permitió continuar con mi día.

ls | grep jpg | <something>

Obtuve una larga lista de 90 000 archivos jpg y los canalicé a avconv para generar un lapso de tiempo.

Anteriormente estaba usando ls *.jpg| avconv antes de encontrarme con este problema.

2
27.01.2020, 19:34

Теги

Похожие вопросы