Как я могу ограничить количество файлов, напечатанных с помощью ls?

89

Есть ли способ ограничить количество перечисленных файлов по lsкоманде?

Я видел:

ls | head -4

но чтобы получить headили tailвыполнить, мне нужно дождаться lsзавершения выполнения и с каталогами с огромным количеством файлов, которые могут занять значительное время.

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

AndreDurao
источник

Ответы:

109

Ты пробовала

ls -U | head -4

Это должно пропустить сортировку, которая, вероятно, поэтому lsзанимает так много времени.

https://stackoverflow.com/questions/40193/quick-ls-command

Niko
источник
"ls -U" по-прежнему читает весь каталог перед печатью ... Я думаю, что напишу небольшой скрипт для ограничения файлов, но эта ссылка на вопрос - хороший материал для чтения. Спасибо, Нико.
AndreDurao
5
@AndreDurao, GNU ls -Uне обязательно читает весь каталог перед печатью. Попробуйте strace -e getdents,write ls -U > /dev/nullв большом каталоге, например.
Стефан Шазелас
Просто примечание: если вы хотите выполнить strace в OSX, ищите dtrace, команда strace - это утилита для Linux
AndreDurao
12

Если в вашей версии lsесть способ не сортировать файлы, например, -Uдля GNU ls , используйте его. Без опции, lsсначала прочитает все файлы, затем отсортирует имена, затем начнет печать.

Другой возможностью является запуск find, который печатает имена по мере их нахождения.

find . -name . -o -prune | head

(обратите внимание, что поскольку headработает со строками , предполагается, что имена файлов не содержат символов новой строки).

жилль
источник
1
Обратите внимание, что в случае GNU find(в отличие от busybox или heirloom или findGNU ls -U), кажется, что он читает весь каталог перед началом печати.
Стефан Шазелас
4

Возможно, вам нужен инструмент, кроме ls?

Например, у Рэндала Шварца есть запись в блоге об использовании perlбольших каталогов, которая может содержать некоторые советы по созданию чего-то, что соответствует вашим потребностям.

В публикации блога Рэндал объясняет, что и то lsи другое findпытается прочитать во всех записях каталога, прежде чем печатать какие-либо, в то время как perlрешение, которое он предлагает, не делает.

AFresh1
источник
Я также подумал, что это может быть лучшим вариантом, потому что ls и find читают весь каталог перед печатью. Я планировал написать скрипт ruby, чтобы сделать это вместо перла, спасибо за это AFresh1!
AndreDurao
1
@AndreDurao, perlвероятно, использует readdir(3)как lsили find. readdir(3)в текущих версиях GNU / Linux, по крайней мере, вызывает getdents()системный вызов с большим счетом (который на самом деле обычно оптимизирует производительность за счет уменьшения количества выполняемых системных вызовов). Но в вашем случае, если вы хотите меньше файлов, похоже, вам придется обходить readdirи использовать вместо этого BSD getdirentries(3)или getdents(2)системный вызов.
Стефан Шазелас
3

Если производительность не имеет значения (как в вопросе, который был закрыт как дубликат этого), и вы хотите перечислить первые n файлов (в отличие от первых n строк вывода ls) в списке не скрытые файлы, отсортированные по имени файла zsh, вы можете использовать:

ls -ld -- *([1,4])

перечислить первые 4 файла. zshТем не менее, он будет читать все содержимое каталога, даже если вы скажете, что не следует сортировать *(oN[1,4])(обратите внимание, что этот список ls также сортируется).

Стефан Шазелас
источник
1

Может быть, меньше лучше подходит для ваших нужд?

 ls /usr/bin | less

Для меня это работает мгновенно на 5-летнем ноутбуке с классическим жестким диском, но голова одинаково быстра.

Вы можете прекратить lessпреждевременно с q.

Полагаю, ваше предположение об источнике задержки в 1 с неверно, но, возможно, зависит от вашего Unix-аромата или вашей команды shell, less или head.

В Linux с GNU-ls

 ls -R /usr | less 

начинает выводить сразу для меня, в то время как весь вывод работает и работает - так что он окончательно не завершен, прежде чем меньше запустится. Вы можете проверить, есть ли у вас постоянная задержка в 1 с или, возможно, больше, в зависимости от выхода или нет.

Я полагаю, что ваша задержка 1с имеет другую причину, может быть, HDD будет спать и нуждается в пробуждении?

У вас есть такая задержка для очень немногих файлов?

неизвестный пользователь
источник
Спасибо, но я не искал что-то подобное. Точно так же, как голова, меньше выполняется с результатом всего lsрезультата. Я искал способ ограничить результаты.
AndreDurao
@AndreDurao: переместил мои комментарии в ответ.
пользователь неизвестен
0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
Абхишек
источник
Я извиняюсь, Абхишек, но смысл этого вопроса в том, чтобы воспользоваться lsкомандой на bash. Водопроводная команды , как grep, head, tailили другие , выполняются послеls
AndreDurao
0
$ cut -f 1,n filename

выполнит задачу извлечения первых nфайлов. nколичество файлов, которые вы хотите извлечь. поэтому полный код будет:

$ ls|cut -f 1,n file
Рамандип Сингх
источник
1
Команда, которую ls | cut -f 1,n fileвы предложили, выводит первое и n-е поля в каждой строке текста fileи полностью игнорирует вывод ls. Это не делает то, что нужно оригинальному постеру.
Телеком
Да, вы правы. Просто исправление сделать это Ls | голова-н ... Это, безусловно, сделает задачу.
Рамандип Сингх