Dosyaları içerdikleri satır sayısına göre sıralama


32

Dosyalardaki /group/book/four/wordsatır sayısını, içerdikleri satır sayısına göre nasıl sıralayabilirim ?

ls -l komut onları sıralar ancak sıralamaz


1
Dosyaların satır sayısına göre mi listelenmesini mi yoksa dosyalardaki satır sayısını mı listelemek istersiniz? ls -lSatır sayısını vermez. ls -lSbazı lsuygulamalarda dosyayı boyutuna göre sıralar ( boyut , içerikteki bayt sayısıdır).
Stéphane Chazelas

Yanıtlar:


34

Böyle bir komut kullanmalısınız:

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
  • find: istediğiniz yoldaki dosyaları arayın. Özyinelemeyi istemiyorsanız ve finduygulamanız destekliyorsa -maxdepth 1, -execseçeneğin hemen önüne eklemelisiniz .
  • exec: komuta wc -lher dosya üzerinde çalışmasını söyler .
  • sort -rn: sonuçları sayısal olarak ters sırada sıralayın. Yukarıdan aşağıya doğru.

(dosya adlarının yeni satır karakterleri içermediğini varsayar).


Birden fazla dosya iletildiğinde (veya bazı uygulamalarda okuyabileceği birden fazla dosya olduğunda) wcda bir totalsatır yazdırılacağını , bu nedenle burada yalnızca bir dosya olmadığı sürece bir veya daha fazla "toplam" satır alacağınızı unutmayın. . Bunları grep /çıkarmak için boru olabilir .
Stéphane Chazelas

çünkü upvote sortkomuta
Francisco

Sadece minimum X satırlı dosyayı gösterecek şekilde nasıl süzebilirim (örnek için X = 0 satır hariç)?
Matrix

11

Sigara özyinelemeli

Özyinelemeye ihtiyacınız yoksa muhtemelen en basit versiyon:

wc -l /group/book/four/word/*|sort -n

wcsayar hatları (opsiyon -lher cinsinden) (ama gizli) ( *) altındaki dosyalar /group/book/four/word/ve sort(boru aracılığıyla sonucunu sıralar |) sayısal olarak (opsiyon -n).

Recursive

Birisi bu cevabı grep -rlcbastırmadan önce söyleyerek yorum yaptı . Nitekim grep, özellikle özyinelemeye ihtiyacınız varsa, harika bir alternatif:

grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2

(seçenek -c) özyinelemeli (isteğe bağlı -r) dizinde eşleşen ( grep) '^'(satırların başlangıcı ) satırları sayar /group/book/four/word/. Daha sonra , ikinci sütunda (isteğe bağlı ) sayısal olarak (isteğe bağlı ) sıralamak istediğiniz , örneğin tryardım sortetmek için kullanarak , boşluğu bir boşlukla değiştirmeniz gerekir .-n-k2

Güncelleme: Stephane'nin olası sınırlamalar ve gerçekte nasıl kurtulacağınız hakkındaki yorumlarını görün tr.


3
grep -c .En az bir geçerli karakter içeren satırları sayar. grep -c '^'Tüm satırları saymak için kullanın (ayrıca bazı grepuygulamalarda son satırdan sonra gelen karakterleri de sayar ). Tüm grepuygulamaların a'yı desteklemediğini -rve davranışların, olanlar arasında farklılık gösterdiğini unutmayın. :S (virgül, noktalı virgül değil) alanlarına çevirmeniz gerekmez sort. Sadece kullan -t:. Dosya adlarının :veya boş veya yeni satır karakterleri içermediğini varsayalım.
Stéphane Chazelas

1
Yinelemeli olmayan çözümünüzü gönderdiğiniz için teşekkür ederiz; wcBirden çok yoldan geçerseniz tüm bu kadar kullanışlı bir toplam verdiğini bilmiyordum . Bu fonksiyonelliğin joker kartla ve boruyla birleştirilmesi sortgerçekten temiz.
Qcom

7

İle zsh:

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

Dosyadaki satır sayısına cevap veren yeni bir sıralama işlevi tanımlarız lines. Ve (sayısal sıralama için) ile birlikte glob sonuçlarının nasıl sıralandığını tanımlayan o+linesglob niteleyicisini kullanıyoruz n. ( .ayrıca sadece normal dosyaları kontrol etmek için eklendi).

Bu, dosya adlarının gizli dosyalardan başka hangi karakterleri içerebileceğini (bununla başlayanlar .) çıkarıldığına dair hiçbir varsayımda bulunmaz. Dİsterseniz glob niteleyicisini de ekleyin .


2
OP bashsadece ile etiketlendi ...
l0b0

7
@ l0b0, buna ihtiyacı olan bir sonraki kişinin de bash yapacağı anlamına gelmez.
Terdon

4

Ayrıca, dosyaları alt dizinlerinde de isteyip istemediğinizi belirtmezsiniz /group/book/four/word. findJherran yanıtında çözüm alt dizinleri içine inecektir. İstenmiyorsa, kabuğu kullanın:

for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

Dosya adlarınız yeni satırlar içeriyorsa, şunun gibi bir şey kullanabilirsiniz:

for file in ./*; do 
    [ -f "$file" ] && 
        printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'

Eğer Son olarak, eğer do alt dizinleri içine dalmak istediğinizde, size bu kullanabilir bash4 veya üzeri:

shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

bash4.3'ten önceki sürümlerin , dizin ağacını yinelemeli olarak alçalırken sembolik işaretleri takip ettiğini unutmayın ( zsh's ya da tcsh' gibi ***/*).

Ayrıca, yukarıdaki tüm çözümler gizli dosyaları görmezden gelecektir (adı a ile başlayanlar ., shopt -s dotglobonları dahil etmek için kullanırlar) ve ayrıca sembolik bağlantıların satır sayısını da içerecektir ( findyaklaşımın kullanmayacağı).


Jherran'ın çözümünden başka farklılıkların da sizinkilerin normal dosyalara bağ kuracağını düşünmesi ( -xtype fGNU bulmasında veya *(-.)zsh'da) ve gizli dosyaları atlayacağına dikkat edin .
Stéphane Chazelas

@ StéphaneChazelas teşekkürler, açıklığa kavuşturuldu. Neden %luiçinde printf? Hatırladığım kadarıyla, bu uzun imzasız ondalık demektir, gerçekten gerekli mi? Neden numarayı bir dize olarak ele almıyorsunuz? Bir fark yaratıyor mu?
terdon

2
Wc çıktısı boşsa (örneğin, dosya okunamadığı için), bu daha sonra 0biraz daha iyi olan boş dize yerine genişleyecektir . Bazı sıralama uygulamaları, bazıları imzalı olan imzasız tamsayılarla çalışır. %luen güvenli bahis gibi gözükse de, muhtemelen her zaman 2^31yaşlanacak, çizgileriniz varmış gibi bir önemi yoktur .
Stéphane Chazelas

1

Eğer yüklemek istiyorsanız fdRust yazılmış gerçekten hızlı dosya bulucu (takmanız gerekir, yine de olması harika)

fd --type=file . | xargs wc -l | sort -n

Temel olarak fddosyaları listeler, xargs dosyaların listesini geçirir wc(kelime sayımını gösterir, ancak -l satırlarını sayır), en sonunda en az satırdan en çok kullanılana kadar sıralanır sort -n.

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.