Sıralamada alt klasörlerin içeriğini içeren bir dizindeki dosyaları listeleme


9

Alt klasörlerin içeriği de dahil olmak üzere bir dizinin tüm içeriğini listelemek istiyorum ama dosya boyutuna göre sıralıyorum. Şimdiye kadar hala ile özyinelemeli iken listeleme ve sıralama kadar başardı ls -lhSR( hdosya boyutları alabilir sürece sahip olmak güzel ama kesinlikle benim için gerekli değil). Muhtemelen bariz bir şeye bakmıyorum ya da imkansızı soruyorum, ama burada herhangi bir tavsiye çok takdir edilecektir.

Yanıtlar:


15

Find komutunu kullanabilirsiniz:

find . -type f -printf "%s %P\n" | sort -n

İsteğe bağlı: Bayt değerlerini insan tarafından okunabilir formata dönüştürmek için şunu ekleyin:

| numfmt --to=iec-i --field=1

Açıklama:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

Ah mükemmel! Çok teşekkür ederim, bu tam olarak ihtiyacım olanı yaptı!
toms

3
Cevabımın sana yardım ettiğine sevindim. Kabul edilen cevabı işaretlemek için lütfen sol taraftaki onay işaretini tıklamayı düşünün. Teşekkürler.
pLumo

1
@RoVo, soruyu cevaplamak da güzel olurdu, çünkü cevapladığınız göz önüne alındığında, muhtemelen ilginç ve yararlı buldunuz.
terdon

Bu gerçekten doğru ve bunu şimdi yaptım ;-)
pLumo

@toms Bu kadar iyi olsa bile, cevabı kabul etmek için bir süre beklemek (belki bir gün kadar) sorun değil. Cevap kabul edildikten sonra, başka bir cevabın daha da iyi olması için bir yol yoktur. Ve bu nedenle, birçok insan başka cevaplar vermeye zahmet etmeyecek, bu yüzden daha iyi olup olmadığını öğrenmek için onları görme şansımız yok.
Monty Harder

7

Belirli bir kabuk belirtmediğiniz için, burada zsh'ın glob niteleyicileri ile bir alternatif

setopt extendedglob

özyineleme için. Sonra örneğin:

  1. düz dosyaları özyinelemeli olarak listeler:

    printf '%s\n' **/*(.)
  2. yinelemeli, düz dosya listesi O ile rdered de katlama L ength (örneğin boyut):

    printf '%s\n' **/*(.oL)
  3. yinelemeli liste düz dosyalar, Ey tarafından rdered de bir kırma boyutu:

    printf '%s\n' **/*(.OL)
  4. boyutu küçülterek sıralanan düz dosyaları özyinelemeli olarak listeler ve ilk 3 sonucu seçer:

    printf '%s\n' **/*(.OL[1,3])

Dosya boyutlarını da istiyorsanız, kullanabilirsiniz

du -hb **/*(.OL[1,3])

4

İle globstarkabuk seçeneği size globbing kabuk kullanabilirsiniz:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

Bunu çok fazla dosyayla denerseniz, “Bağımsız değişken listesi çok uzun” hatası alırsınız. Bu etrafında işin için kullanabilir printfve xargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

Ben sadece bu (4096 bayt büyüklüğünde) dizinleri de yazdırdı - bunu istemiyorsanız, bunun yerine kullanın:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Örnek çalışma

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

Güzel çözüm. Bulmakla karşılaştırıldığında, gizli dosyaları içermez, bunu nasıl başarırsınız?
pLumo

@RoVo Bunları her zaman unutun - sadece dotglobkabuk seçeneğini ayarlamanız gerekiyor , güncellenmiş cevabımı görün.
tatlı

Sed ile gerçekten sonra dizinleri soymak yerine, şöyle bir şey düşünebilirsinizprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver

ls -lhSd **/*Listenin bir parçası olarak dizinleri sakıncası yoksa kullanabilirsiniz . Dizin adları hiçbiri varsa Ya .onları ve istediğiniz tüm dosyaları yapmak yapabilirsiniz, ll -hS **/*.*veya benzer.
Peter Cordes


3

Zsh'niz yoksa du+ kullanabilirsiniz sort:

  1. Toplu dizin boyutları dahil, okunabilir boyutlar:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Yalnızca dosyalar (kullanılıyor find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

Her iki durumda da, ben kullanım boşlukla sonlandırılmış hatları (seçtiniz -0, -z, -print0tüm geçerli dosya adları karşı güvenli olması için, seçenekler).


0

Çok büyük olmayan dizin ağaçlarında hızlı etkileşimli kullanım için shopt -s globstargerçekten güzel. Bir gıdım bile türüne göre dizinleri filtrelemeyen, ancak bunu kullanırsanız ls -do zaman lssadece yerine içindekiler, dizin adını yazdırır.

llTakma adınızın şunları içerdiğini varsayarsak -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

size bu şekilde çıktı verecektir (benim kod-golf dizininden), ancak renk vurgulama ile (böylece dizinleri görmek daha kolay). Alt dizinlerde dosya boyutuna göre sıralama yapıldığını unutmayın.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

Yoluyla boruları filtreleyerek grep -v '^d'

Dosya adlarınızda bir desen varsa, bazen yalnızca dosyalarla eşleşen dizinleri değil, bir glob kullanabilirsiniz. Örneğin ll -rSd **/*.jpg, **/*.*dizin adlarınızın hiçbiri .bunlarda yoksa ve istediğiniz tüm dosyalar içindeyse çalışır .

(DOS arka planı olan kişiler için: *.*Unix'te büyülü bir şey yoktur . Yalnızca gerçek bir nokta içeren herhangi bir dizin girdisiyle eşleşir. Ancak yürütülebilir dosyalar ve bazen metin dosyaları dışında, dosya adlarına uzantı vermek yaygındır.)

@ tatlı, tüm dosyalarla shopt -s dotglobeşleşmesi için ihtiyacınız olduğunu belirtir .


GNU ile find

Bir lskomut satırına sığmayacak kadar çok dosya yoksa, find -exec ls {} +bunları lssıralayabilecekleri komut satırına yerleştirir .

find -not -type d -exec ls --color -lrSh {} +

-not -type dBunun yerine kullanmak -type f, linkleri, adlandırılmış boruları, soketleri, cihaz dosyalarını ve dizinlerinizde tekme attığınız şeyleri göz ardı etmekten kaçınır.


İle du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

Şimdi dizin adları, tüm içeriklerinin toplamı ile birlikte listede sıralanır, ancak tek tek dosyalar hala dahil edilir.

sort -h, diğer bir deyişle --human-numeric-sort, sayıları du -hbaskı gibi boyut sonekleriyle sıralar . İle kullanım için mükemmeldir du.

Sıklıkla du -sch * | sort -hya da */sadece dizin almak için kullanıyorum.

du -sch **/* | sort -hdubir -aseçenek olduğunu unutursanız, yukarıdaki çıktıyı verecektir .

(Sadece bakmak için zaman ayırdım çünkü bir cevap gönderiyorum. Etkileşimli kullanım için, muhtemelen kullanmış olurdum du -sch **/*.

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.