максимальное количество файлов ls может отображать

Я использую скрипт для удаления старого файла в каталоге, но скрипт продолжал показывать

/usr/bin : Argument list too long 

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

Это сообщение не от ls , а от exec . вы можете увидеть максимальный размер списка аргументов, запустив getconf ARG_MAX .

Это не столько файлов, которые могут обрабатываться приложением, но и размера аргументов, которые могут быть переданы с помощью exec в операционную систему, что возвращает E2BIG если размер аргументов превышает допустимый диапазон.

Этот предел был традиционно (до Linux 2.6.23), предоставленный с использованием ядра, определит ARG_MAX , найденный в sys/linux/limits.h . Однако в настоящее время это специфично для среды, в которой вы работаете. Как правило, максимальная длина аргументов теперь может достигать четверти от размера стека в пользовательском пространстве.

Предел варьируется между операционными системами и версиями. Предел – это не количество файлов, а байтов. Вы можете (обычно) получить свой локальный предел следующим образом:

 $ getconf ARG_MAX 2097152 

См. Также: FAQ BASH 095

Ситуация не то же самое, если вы это делаете

 ls /usr/bin 

или

 ls /usr/bin/* 

Потому что во втором случае bash glob возвращает список, который передается в ls и это очень ограниченно (что является одной из причин, почему xargs существует). Я даже думаю, что ограничение оболочки ниже предела exec.

Я столкнулся с этой ситуацией при работе с 4.2 BSD давно. Под оболочками оболочка имеет пространство памяти в среде, которое используется для передачи аргументов командной строки вызываемым программам. Как уже упоминалось, он варьируется от Unix до Unix, но часто является настраиваемым параметром в ОС.

Расширение этого пространства в системе повышает требования к памяти для всей системы, поэтому это может быть не оптимальным для вас. Что было бы полезно изучить для вашей цели, так это использование параметра -exec в синтаксисе «найти», как в этом синтаксисе, для рекурсивного поиска и удаления файлов (тип f) в текущем каталоге (и ниже), которые старше 30 дней (-mtime +30):

 find . -type f -mtime +30 -exec rm {} \; 

Его очень мощный, и он сам делает удаление, поэтому нет ограничений на количество удаленных файлов. Если ваше удаление должно соответствовать файлам определенных шаблонов имен, вы можете сгенерировать их с помощью find.