Bir dizindeki ilk 100 dosyayı zamana göre sıralamanın en iyi yolu


12

Bir dizindeki 100 ilk dosyayı, oluşturulan zaman damgasına (ilk önce en eski) göre sıralanmış olarak listelemenin en iyi yolu nedir? Dizin oldukça büyük (yaklaşık 100000 dosya).

ls taşınıyor kafa tamamlamak için korkunç bir uzun zaman alır.

Düzenle:

  • Dosya sistemi ext3'tür.
  • klasördeki dosya sayısını sınırlamak çabaya değmez, çünkü bu nadir bir "temizleme" işlemi olacaktır ve dosyalar 3. taraf bir yazılım tarafından üretilir.
  • Dosya değiştirme zamanı kullanarak , yerine oluşturma zamanı ve kabul edilebilir bir çözüm sağlar.


1
Bu bir temizleme işlemiyse, istediğiniz şey, yalnızca find -mtime +<number of days> -deletebelirli bir yaştan daha eski olan tüm dosyaları temizlemektir. Bu, hiçbir çeşit gerekli olmadığı anlamına gelecektir.
Mikel

Yanıtlar:


14

Sen "demek ls taşınıyor kafasına tam korkunç bir uzun zaman alır".

Bunun nedeni lsdizininizdeki dosya sayısı değil . Tek bir dizinde 100.000 dosyanız varsa, bu sorunu çözmenin herhangi bir yolu, bunları sıralamayı veya herhangi bir çıktıyı yazdırmayı düşünmeden önce tüm 100.000 dosya hakkında bilgi almalıdır.

Çok uzun sürerse, gerçek çözüm dosyaları birden çok dizine bölmektir.

Dosyaları çeşitli dizinlere dağıtamıyorsanız, dikkate alınacak dosya sayısını daraltmanın bir yolu var mı? örneğin dosya adları bir tarih içeriyorsa, sistemin 100.000 dosyayı sıralaması gerekmeyecek bir joker karakter ekleyebilirsiniz. Ya da belki sıralı olarak numaralandırılırlar? (Bu yardımcı olabilir veya olmayabilir, ama denemeye değer.)

Bunu kaç kez yapmaya çalışıyorsunuz? Belki de yeniden kullanım için çıktıyı kaydetmeye / önbelleğe almaya değer .


Şimdi bir soru.

"Değişim zamanı" değil, "yaratma zamanı" demek istediğinizden emin misiniz ? Çoğu araç, "oluşturma zamanını" değil, yalnızca "değiştirme zamanını" görüntüleyebilir.

"Oluşturma zamanı" elde etmek, ext4 dosya sistemi ve kurulumu kolay olmayan bazı araçlar gerektiren çok yeni bir şeydir.


Zaman değiştirmek istiyorsanız

Değişim zamanı (kısaca ctime), dosyanın özniteliklerinin en son değiştirildiği zaman anlamına gelir.

ls -c ctime'a göre sıralar.

Çıktının azalan sırada değil, artan sırada olmasını istersiniz, bu nedenle çıktıyı da -rseçenekle tersine çevirmeniz gerekir .

Böylece bunu şöyle yapabilirsiniz:

ls -cr | head -n 100

Aynı soruna daha uzun bir çözüm kullanarak stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

ama bu ls -crbenim sistemime göre daha yavaş çalışıyor .


Değişiklik zamanı istiyorsanız

Değiştirme zamanı (kısaca mtime) dosyanın içeriğinin en son değiştirildiği zaman anlamına gelir.

ls -t mtime tarafından sıralar.

Değişim ls -criçin ls -tr(en iyi seçenek) ya da değişim stat -c $'%Z\t%n'için stat -c $'%Y\t%n'.


Yaratılış zamanına ihtiyacınız varsa

(kısaca crtime)

Bu daha zor.

İlk olarak, dizinin kullanılarak biçimlendirilmiş bir dosya sisteminde olduğundan emin olun ext4. Bunu tune2fs -l <device name>kontrol etmek için kullanabilirsiniz .

Sonra, burada size yardımcı olabilecek yeni bir statformat %Wvar. Bunu elde etmek için, Ekim 2010'da veya sonrasında yayınlanan bir GNU Coreutils sürümünü indirmeniz , ayıklamanız, derlemeniz ve yüklemeniz gerekir.

Sonra, çekirdeğinize bağlı olarak, bu işe yarayabilir (denemedim).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Ayrıca bakınız:


Hakkında hata alırsanız "'$\t'

'$\t'Notasyonu gerektirir bashya zsh: o çalışmaz dashveya shUbuntu üzerinde. Gerçekten bu kabukları kullanmanız gerekirse, herhangi değiştirmeniz gerekecektir \tiçin Ctrl+ V, Tabve lider kaldırmak $sadece açılış alıntı öncesinden.


Ext4 çalıştırmıyor olabilir. Ubuntu 10.04'ü tüm makinelerimde çalıştırıyorum, ancak JFS'yi birkaç sürücüde çalıştırıyorum. AFAIK JFS, zaman damgalarının oluşturulmasını destekler.
jwernerny

Aslında. Ext3'te desteklenmediğini ve ext4'te desteklendiğini biliyoruz. Hızlı bir arama, zfs veya FreeBSD ufs ile çalışabileceğini gösteriyor, ancak bunların ikisi de Ubuntu'da yaygın değil! Jfs veya xfs veya başka bir şey hakkında emin değilim. Bilgi / bağlantılar bulabilirseniz daha fazla duymak mutlu olurdu.
Mikel

Bu çok kapsamlı cevap ve ince hatırlatma daha özel sorular yazmak için teşekkür ederiz;) "Bul" kazanan bir performans olduğu ortaya çıktı, fs-tipi ext3 olduğu ortaya çıktı.

2

Bugün bir şeyler yapmanın başka bir yolu performans sorunlarınızla ilgili olabilir:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

Teoride bu çok daha hızlı çıktı vermeye başlamalıdır ama sanırım gecikmenin nereden geldiğine bağlı. Sadece tüketebilir lsdosyaları sıralamak için uzun zaman.


Şüpheliyim. headyeterli girişi okuduktan sonra gerçekten çıkar. Her ikisini timede önden çalıştırmayı deneyin . headVersiyon zaten sistemimde çok daha hızlıdır.
Mikel
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.