Есть ли способ ограничить количество перечисленных файлов по ls
команде?
Я видел:
ls | head -4
но чтобы получить head
или tail
выполнить, мне нужно дождаться ls
завершения выполнения и с каталогами с огромным количеством файлов, которые могут занять значительное время.
Я хочу выполнить ls
команду, которая ограничивает без использования этой head
команды.
command-line
ls
limit
AndreDurao
источник
источник
ls -U
не обязательно читает весь каталог перед печатью. Попробуйтеstrace -e getdents,write ls -U > /dev/null
в большом каталоге, например.Если в вашей версии
ls
есть способ не сортировать файлы, например,-U
для GNU ls , используйте его. Без опции,ls
сначала прочитает все файлы, затем отсортирует имена, затем начнет печать.Другой возможностью является запуск
find
, который печатает имена по мере их нахождения.(обратите внимание, что поскольку
head
работает со строками , предполагается, что имена файлов не содержат символов новой строки).источник
find
(в отличие от busybox или heirloom илиfind
GNUls -U
), кажется, что он читает весь каталог перед началом печати.Возможно, вам нужен инструмент, кроме
ls
?Например, у Рэндала Шварца есть запись в блоге об использовании
perl
больших каталогов, которая может содержать некоторые советы по созданию чего-то, что соответствует вашим потребностям.В публикации блога Рэндал объясняет, что и то
ls
и другоеfind
пытается прочитать во всех записях каталога, прежде чем печатать какие-либо, в то время какperl
решение, которое он предлагает, не делает.источник
perl
вероятно, используетreaddir(3)
какls
илиfind
.readdir(3)
в текущих версиях GNU / Linux, по крайней мере, вызываетgetdents()
системный вызов с большим счетом (который на самом деле обычно оптимизирует производительность за счет уменьшения количества выполняемых системных вызовов). Но в вашем случае, если вы хотите меньше файлов, похоже, вам придется обходитьreaddir
и использовать вместо этого BSDgetdirentries(3)
илиgetdents(2)
системный вызов.Если производительность не имеет значения (как в вопросе, который был закрыт как дубликат этого), и вы хотите перечислить первые n файлов (в отличие от первых n строк вывода
ls
) в списке не скрытые файлы, отсортированные по имени файлаzsh
, вы можете использовать:перечислить первые 4 файла.
zsh
Тем не менее, он будет читать все содержимое каталога, даже если вы скажете, что не следует сортировать*(oN[1,4])
(обратите внимание, что этот списокls
также сортируется).источник
Может быть, меньше лучше подходит для ваших нужд?
Для меня это работает мгновенно на 5-летнем ноутбуке с классическим жестким диском, но голова одинаково быстра.
Вы можете прекратить
less
преждевременно с q.Полагаю, ваше предположение об источнике задержки в 1 с неверно, но, возможно, зависит от вашего Unix-аромата или вашей команды shell, less или head.
В Linux с GNU-ls
начинает выводить сразу для меня, в то время как весь вывод работает и работает - так что он окончательно не завершен, прежде чем меньше запустится. Вы можете проверить, есть ли у вас постоянная задержка в 1 с или, возможно, больше, в зависимости от выхода или нет.
Я полагаю, что ваша задержка 1с имеет другую причину, может быть, HDD будет спать и нуждается в пробуждении?
У вас есть такая задержка для очень немногих файлов?
источник
ls
результата. Я искал способ ограничить результаты.источник
ls
командой на bash. Водопроводная команды , какgrep
,head
,tail
или другие , выполняются послеls
выполнит задачу извлечения первых
n
файлов.n
количество файлов, которые вы хотите извлечь. поэтому полный код будет:источник
ls | cut -f 1,n file
вы предложили, выводит первое и n-е поля в каждой строке текстаfile
и полностью игнорирует выводls
. Это не делает то, что нужно оригинальному постеру.