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


89

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

Я видел:

ls | head -4

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

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

Ответы:


109

Ты пробовала

ls -U | head -4

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

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


"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решение, которое он предлагает, не делает.


Я также подумал, что это может быть лучшим вариантом, потому что 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 | голова-н ... Это, безусловно, сделает задачу.
Рамандип Сингх
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.