Ls ile yazdırılan dosya sayısını nasıl sınırlarım?


89

Bir lskomutta listelenen dosyaların sayısını sınırlamanın bir yolu var mı ?

Gördüm:

ls | head -4

Ancak, yürütülmesi headveya tailyürütülmesi için lsyürütmeyi bitirmeyi beklemem gerekiyor ve çok fazla zaman alabilen çok sayıda dosya içeren dizinler var.

Bu lskomutu kullanmadan sınırlayan bir komut çalıştırmak istiyorum head.

Yanıtlar:


109

Denedin mi

ls -U | head -4

Bu sıralama atlamalı, bu yüzden muhtemelen bu lskadar uzun sürüyor.

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


"ls -U", yazdırmadan önce hala tüm dizini okuyor ... Dosyaları sınırlamak için küçük bir komut dosyası yazacağımı düşünüyorum, ancak bu soru bağlantısı iyi bir okuma materyalidir. Sağol Niko.
AndreDurao

5
@AndreDurao, GNU ls -Uyazdırmadan önce tüm dizini mutlaka okumaz. strace -e getdents,write ls -U > /dev/nullÖrneğin büyük bir dizinde deneyin .
Stéphane Chazelas 14:15

Sadece bir not: OSX'te strace'i çalıştırmak istiyorsanız, dtrace'ı arayın, strace komutu bir Linux yardımcı programıdır
AndreDurao

12

Eğer sürümünüzün GNU lsls gibi dosyaları sıralamamaya yarayan bir yolu varsa kullanın. Seçeneği olmadan önce tüm dosyaları okuyacak, sonra adları sıralayacak, sonra yazdırmaya başlayacak.-Uls

Başka bir olasılık da findisimleri buldukça basan koşmaktır.

find . -name . -o -prune | head

( satırlardahead çalıştığından, dosya adlarının yeni satır karakterleri içermediğini varsayar.)


1
GNU durumunda find(meşgul kutusuna veya yadigarı findveya GNU'ya karşılık olarak ls -U), yazdırmaya başlamadan önce tüm dizini okuyor göründüğünü unutmayın.
Stéphane Chazelas 14:15

4

Belki başka bir araca ihtiyacınız var ls?

Örneğin, Randal Schwartz hakkında bir blog girişi vardır kullanarak perlbüyük dizinlerde ihtiyaçlarınızı karşılayan bir şey inşa bazı ipuçları içerebilir.

Randal gönderme blogda her iki açıklıyor lsve findsüre girişimi, herhangi yazdırmadan önce tüm dizin girişlerini okumak için perlo önermektedir çözüm değil.


Bunun en iyi seçenek olabileceğini de düşündüm, çünkü hem ls hem de find, yazdırmadan önce tüm dizini okudu. Bunun yerine inci yerine bir yakut senaryo yazmayı planlamıştım, AFresh1 için teşekkürler!
AndreDurao

1
@AndreDurao, perlmuhtemelen veya readdir(3)gibi kullanır . GNU / Linux'un şu anki sürümlerinde en azından sistem çağrısını büyük bir sayımla çağırıyor (bu, yapılan arama sayısını azaltarak genellikle performansı optimize ediyor). Ancak sizin durumunuzda, daha az dosya istiyorsanız, bunun yerine BSD'leri veya sistem çağrısını atlayıp kullanmanız gerekecek gibi görünüyor . lsfindreaddir(3)getdents()readdirgetdirentries(3)getdents(2)
Stéphane Chazelas 14:15

3

Performans (bu bir kopyası olarak kapatıldı söz konusu gibi) endişe değildir ve sen (çıktısının birinci n hatları aksine ilk n dosyaları listelemek istiyorsanız lsolmayan listesinde) dosya adına göre sıralanmış gizli dosyaları zshkullanabilirsiniz:

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

İlk 4 dosyayı listelemek için. zshBununla birlikte, sıralamamasını söyleseniz bile, dizinin tam içeriğini yine de okuyacaktır *(oN[1,4])( bu listeyi ls de sıraladığını unutmayın ).


1

Belki daha az ihtiyaçlarınız için daha uygun olur?

 ls /usr/bin | less

Benim için, klasik HDD özellikli 5 yaşında bir dizüstü bilgisayarda anında çalışıyor, ancak baş eşit derecede hızlı.

lessErken ile sonlandırabilirsiniz q.

Sanırım 1'lerin gecikmesinin kaynağı hakkındaki varsayımınız yanlış, ama belki Unix lezzetinize veya kabuğunuza, daha azına veya baş komutuna bağlı.

Linux'ta, GNU-ls ile,

 ls -R /usr | less 

Tüm çıktı çalışırken ve çalışırken hemen benim için çıktı almaya başlar - bu yüzden daha az başlamadan önce kesin olarak bitmedi. Çıktıya bağlı olarak 1 saniye veya daha fazla sürekli gecikme olup olmadığını kontrol edebilirsiniz.

Sanırım 1'lerin gecikmesinin farklı bir nedeni var, belki de HDD'nin uykuya dalması ve uyanması gerekebilir mi?

Çok az dosya için de böyle bir gecikme var mı?


Teşekkürler ama ben böyle bir şey aramıyordum. Tıpkı kafa gibi, bütün lssonucun sonucu daha az idam edilir . Sonuçları qty sınırlamak için kendi yolunu arıyordum.
AndreDurao

@AndreDurao: Yorumlarımı cevaba taşıdı.
kullanıcı bilinmeyen

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

Üzgünüm Abhishek, ama bu sorunun amacı lsbash emri vermek. Borulu gibi komutları grep, head, tailveya başkalarının sonra infaz edilirls
AndreDurao

0
$ cut -f 1,n filename

ilk ndosyaları alma görevini yapacak . nayıklamak istediğiniz dosya sayısıdır. bu yüzden tam kod şöyle olacaktır:

$ ls|cut -f 1,n file

1
ls | cut -f 1,n fileEğer metnin her satırında çıktı ilk ve inci alanını olur önerdi komuta fileve tamamen çıktısını göz ardı edecektir ls. Bu, orijinal posterin ihtiyaç duyduğu şeyi yapmaz.
telcoM

Evet haklısın. Sadece bir düzeltme yap ls | head -n ... Bu kesinlikle görevi yapacak.
Ramandeep Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.