Ls -f'nin anlamı nedir (ya da bu neden asılı?)


9

İçinde yaklaşık 100.000 dosya bulunan bir dizin var. ls -f bir dakikadan fazla askıda kalýr. Strace koştu ve hemen getdents görmeye başladı, bu yüzden ls açıkça dizini okuyor. Ayrıca brk için bir sürü çağrı görüyorum, bu yüzden ls açıkça bellekteki şeyleri arabelleğe alıyor. Ben readdir çağıran ve dosya adları veren basit bir program yazdım ve hemen yanıt verdi. Ancak ls -f çıktı sağlamaz. Ne oluyor? Ben -f bütün mesele ls readdir daha başka bir şey yapmasına neden olduğunu düşündüm. Bir dizinin içeriğini listelemenin taşınabilir ve güvenilir bir yolu var mı? (Not, bu Linux'un GNU's coreutils ls.)

-DÜZENLE-

Bir takma ad vardı, ancak "/ bin / ls -1f> / dev / null" 8 ila 15 saniye sürer, "/ bin / ls -1fx> / dev / null" 4 ila 11 saniye sürer, ancak basit bir program readdir sadece .011 saniye alır. GNU'ların emilmemesi için ne yapmam gerekir?

Yanıtlar:


7

Noktası -fçalışacağım ve her dosya girdisini stat ve herhangi gösterilen tüm önce onları okumak için gereksinimini ortadan gereğini kaçınmaktır. Diğer seçenekleri devre dışı bırakan bir "meta" seçeneğidir.

Yani, evet, beklediğinizi yapmalı. Neden olmasın cevap veremem, ama bir kabuk takma adı veya komuta ek seçenekler ekleyen başka bir şey olabilir tahmin ediyorum. Bu, bir özelliği -fdevre dışı bırakmaktan daha yeniden etkinleştirebilir ve "daha spesifik" olarak kabul edilebilir, bu nedenle öncelikli olun.


2
Argghh. ls () {/ bin / ls -FB $ @; Aptal başlangıç ​​komut dosyaları.
William Pursell

1
hı. Ben fonksiyonu unset ve ben / bin / ls çalıştırdığımda bile hala aynı davranışı görüyorum.
William Pursell

/ Bin / ls -f -1 yapın (eksi-bir, eksi-ell değil). RHEL kutusundaki / bin / ls nedenlerden dolayı sütunlardaki dosya adlarını kullanıyorum.
Bruce Ediger

0

Coreutils 7.0'a bir optimizasyon eklendi (taahhüt 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <kdudka@redhat.com>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

Akla gelen ilk açıklama, coreutils'in eski bir sürümünü çalıştırdığınızdır. Yükseltmeniz gerekiyor.

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.