Я наконец нашел то, что вызывало проблему. Это происходило из-за моего маршрутизатора, блокирующего сообщения проверки активности 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".
Ваш список аргументов сообщения об ошибке слишком долго прибывает из * 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"
Это зависит главным образом от Вашей версии ядра 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 ниже об именах файлов, которые содержат новые строки.)
.
и -maxdepth 1
средний в последней строке?Спасибо! :D
– Guilherme Salomé
27.06.2017, 18:41
.
текущий каталог средств, -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
файлы.
И необходимо рассмотреть реорганизацию файлов, таким образом, у Вас нет так многих в единственном каталоге. Это может или не может быть выполнимо.
MAX_ARG_PAGES, кажется, параметр ядра. Используя find
и xargs
типичная комбинация состоит в том, чтобы обратиться к этому пределу, но я не уверен, что это будет работать на wc
.
Передача по каналу вывода find . -name \*\.txt
в файл и подсчет строк в том файле должен служить обходным решением.
ls
вывод, не решит это. Пока *.txt подстановочный знак расширен по пределу, перестанет работать перед ровным запуском ls
и генерация любого вывода.
– manatwork
18.05.2012, 19:05
ls
необходимо указать -maxdepth 1
постараться не рекурсивно сканировать подкаталоги.
– manatwork
18.05.2012, 19:19
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.
-maxdepth 1
если Вы не намереваетесь считать файлы в подкаталогах. – Shawn J. Goff 18.05.2012, 20:25-exec echo \;
. – Mikel 18.05.2012, 21:57find
.find
на OS X и в находящихся в busybox системах, и я предположил бы, что любая основанная на BSD система показывает имя файла с новой строкой в нем, которая смешала бы с количеством. подпись – Shawn J. Goff 19.05.2012, 00:01wc -l
считает новые строки. Таким образом, мы хотим, чтобы это имело новые строки. – Mikel 19.05.2012, 01:05