Як обмежити кількість файлів, надрукованих 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(на відміну від busbox або heirloom findабо GNU ls -U), здається, він читає весь каталог перед початком друку.
Стефан Шазелас

4

Можливо, вам потрібен інший інструмент, крім ls?

Наприклад, Рандаль Шварц має запис у блозі про використання perlу великих каталогах, який може містити певні підказки щодо створення чогось, що відповідає вашим потребам.

У публікації щоденника блогу Рандаль пояснює, що обидва lsі findнамагаються прочитати всі записи каталогів перед тим, як надрукувати будь-які, тоді як perlрішення, яке він пропонує, не робить.


Я також подумав, що це може бути найкращим варіантом, тому що обидва ls і знайти прочитайте весь каталог перед друком. Я планував написати рубіновий сценарій, щоб зробити це замість перлини, спасибі за це 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.

Я думаю, ваше припущення про джерело затримки 1s неправильне, але, можливо, це залежить від вашого Unix-аромату чи вашої оболонки, меншої чи головної команди.

У Linux, з GNU-ls,

 ls -R /usr | less 

Починає виводити негайно для мене, тоді як весь вихід працює і не працює, тому він, безумовно, не закінчений, перш ніж менше запускається. Ви можете перевірити, якщо у вас постійна затримка в 1 або може бути більше, залежно від виходу чи ні.

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

Чи є у вас така затримка і для дуже мало файлів?


Дякую, але я не шукав чогось такого. Так само, як і голова, менше виконується з результатом всього lsрезультату. Я шукав спосіб ls, щоб обмежити кількість результатів.
AndreDurao

@AndreDurao: Я перемістив свої коментарі у відповідь.
користувач невідомий

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

Вибачте Абхішек, але суть цього питання полягає в тому, щоб скористатися lsкомандою на баш. Водопровідна команди , як 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Команда , яку ви запропонували б вихід першого і п - -й поле в кожному рядку тексту file, і буде повністю ігнорувати вихід ls. Це не робить те, що потрібно оригінальному афіші.
telcoM

Так, ти маєш рацію. Просто виправлення зроби це ls | head -n ... Це обов'язково зробить завдання.
Рамандейп Сінгх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.