Dosyaları boyuta göre tekrarlayarak sıralama


78

Bir klasördeki en büyük dosyaları bulmam gerekiyor.
Bir klasörü tekrar tekrar tarayabilir ve içerikleri boyuta göre nasıl sıralayabilirim?

Kullanmayı denedim ls -R -Sama bu dizinleri de listeliyor.
Ben de kullanmayı denedim find.


1
Her bir alt dizindeki dosyaları ayrı ayrı mı listelemek istersiniz yoksa tüm alt dizinlerdeki tüm dosyaları bulmak ve içinde bulundukları alt dizine bakılmaksızın bunları boyuta göre listelemek ister misiniz? Ayrıca, "dizin" ve "klasör" ile ne demek istiyorsunuz? Onları farklı şeyler tanımlamak için kullanıyor gibi görünüyorsun.
terdon

Belirli bir dizindeki dosyaları ve sadece alt dizinlerini göstermeden alt dizinlerindeki dosyaları listelemek istediğinizi mi söylüyorsunuz? Lütfen sorunuzu temizlemeye çalışın, çok net değil.
slm

Yanıtlar:


92

Bunu sadece ile de yapabilirsiniz du. Sadece güvenli tarafta olmak için bu sürümü kullanıyorum du:

$ du --version
du (GNU coreutils) 8.5

Yaklaşım:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Yaklaşımın dağılması

Komut du -ah DIR, verilen bir dizindeki tüm dosya ve dizinlerin listesini üretecektir DIR. Bu -hbenim tercih ettiğim okunabilir insan boylarını üretecek. Onları istemiyorsanız, o anahtarı bırakın. head -6Çıktı miktarını sınırlamak için sadece kullanıyorum !

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

En küçükten büyüğe doğru sıralamak için yeterince kolay:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Ters çevir, en büyüğünden en küçüğüne:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

Bana dizini gösterme, sadece dosyaları.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Eğer sadece en küçüğünden en büyüğüne kadar olan listeyi istiyorsan, ama ilk 6 suçlu dosyayı sort anahtarını tersine çevirebilirsin, bırak ( -r) ve tail -6yerine kullanabilirsiniz head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
grep -v "/$"Bölüm dizinleri bir çizgi eklenmiş yok gibi, beklediğiniz yapıyor gibi görünmüyor. Dizinlerin sonuçlardan nasıl çıkarılacağını bilen var mı?
Jan Warchoł

@JanekWarchol - coreutils'in hangi sürümünü kullanıyorsunuz?
slm

8.13. Ama yine de, cevabınızdaki çıktının izleri de /yok - mesela /home/saml/Downloads/audiblebir dizin gibi görünüyor, ancak kesik çizgisi yok. Yalnızca /home/saml/Downloads/bir eğik çizgi vardır, ancak bunun nedeni muhtemelen başlangıç ​​için argümanı belirtirken bir eğik çizgi ile yazmanızdır du.
Jan Warchoł

1
Bu, aynı zamanda
kir

1
Bu sadece dosyaları listelemez, aynı zamanda dizinleri de listeler :(
Roman Gaufman

20

Geçerli dizindeki ve alt dizinlerindeki tüm dosyaları bulmak ve boyutlarına göre (yollarını düşünmeden) listelemek ve dosya adlarından hiçbirinin newline karakterleri içermediğini varsayarak, GNU findile şunları yapabilirsiniz:

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

Gönderen man findbir GNU sistemi üzerinde:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

Kimden man sort:

   -n, --numeric-sort
          compare according to string numerical value

Mac'te maalesef çalışmıyor, gösterileri: bul: -printf: bilinmeyen birincil ya da işleç
Roman Gaufman

@RomanGaufman evet, bu yüzden cevap GNU'yu bulmayı belirliyor . Mac'inize GNU araçlarını yüklerseniz, o da orada çalışacaktır.
Terdon

11

Aşağıdaki komutu deneyin:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Geçerli dizindeki en büyük 20 dosyayı tekrar tekrar listeleyecektir.

Not: seçenek -hiçin sortyüklemek ettik böylece, OSX / BSD kullanılamaz sortdan coreutils(örn aracılığıyla brew) ve yerel bin yolunu uygulamak PATH, örneğin

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Alternatif olarak kullanın:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

En büyük dizinlerin kullanımı için du, örneğin:

du -ah . | sort -rh | head -20

veya:

du -a . | sort -rn | head -20

3
Mükemmel, bu Mac'te çalışan ve dizinleri göstermeyen ilk çözüm :) - teşekkür ederim!
Roman Gaufman

filtre sadece satır sayısı> = X olan dosyayı göstermek için nasıl? (Örnek için X = 0)
Matrix

7

Bu, tüm dosyaları yinelemeli olarak bulur ve boyuta göre sıralar. Tüm dosya boyutlarını kb cinsinden yazdırır ve aşağı yuvarlar böylece 0 KB dosya görebilirsiniz, ancak benim kullanımım için yeterince yakındı ve OSX'de çalışıyor.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


Ubuntu 14.04'te de çalıştı!
David Lam,

Bu, sadece dosyaları değil, dizinleri listeler :(
Roman Gaufman

@RomanGaufman - Geri bildiriminiz için teşekkür ederiz! testlerimden find . -type fdosyaları bulur ... özyinelemeli çalışır, haklısın, ama bulduğu tüm dosyaları listeler, dizinleri değil
Brad Parks

Xargs 1980'lerde kullanılmıştır. 1989'dan bu yana uygulamanın David Korn tarafından tanıtılması kötü bir fikir.
schily

5

Bununla birlikte zsh, en büyük dosyayı ( ls -lçıktıdaki boyut sütunu gibi görünür boyut açısından, disk kullanımı yerine) bulacaksınız :

ls -ld -- **/*(DOL[1])

6 büyük olanlar için:

ls -ld -- **/*(DOL[1,6])

Bunları dosya boyutuna göre sıralamak için ls's -Sseçeneğini kullanabilirsiniz . Bazı lsuygulamalarda , listeyi sıralamama -Useçeneği de vardır ls( zshburada zaten boyuta göre sıralanmıştır ).


3

Dizinleri atlayan Mac / Linux için basit çözüm:

find . -type f -exec du -h {} \; | sort -h

2

Eşdeğer BSDya da OSXbir

$ du -ah simpl | sort -dr | head -6

0

Bu, çeşitli nedenlerden dolayı inanılmaz derecede yaygın bir ihtiyaçtır (bir dizinde en son yedeklemeyi bulmayı severim) ve şaşırtıcı derecede basit bir iştir.

Bulmak, xargs, stat, tail, awk ve sort yardımcı programlarını kullanan bir Linux çözümü sunacağım.

Çoğu kişi bazı benzersiz yanıtlar verdi, ancak benimkini tercih ediyorum çünkü dosya adlarını doğru bir şekilde işliyor ve kullanım durumu kolayca değiştirilebilir (stat değerini değiştirir ve argümanları sıralar)

Ayrıca, bu işlevi Windows'ta bile kullanmanıza izin veren bir Python çözümü sunacağım

Linux komut satırı çözümü

Yalnızca bir dizindeki tüm dosyaların listesini dosya boyutuna göre sırayla döndürür

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Daha önce olduğu gibi, ancak bu sefer en büyük dosyayı döndür.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Tam olarak aynı Desen, ancak şimdi en büyük yerine en yeni dosyayı seçin

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Açıklama:

  1. find: Geçerli dizindeki tüm dosyaları tekrar tekrar bulur ve boş bir karakterle yazdırır
  2. xargs: standart girdiden sağlanan argümanları kullanarak komutları çalıştırmak için yardımcı program. Her çıktı satırı için, stat yardımcı programını o dosya üzerinde çalıştırmak istiyoruz.
  3. stat: Stat, pek çok kullanım senaryosuna sahip, her yönüyle harika bir komuttur. İki sütun yazdırıyorum, ilk sütun blok boyutu (% s) ve ikinci sütun dosya adı (% n)
  4. sort: Sonuçları sayısal anahtarla sıralayın. İlk argüman bir tamsayı olduğundan, sonuçlarımız doğru bir şekilde sıralanacaktır.
  5. kuyruk: Yalnızca son çıktı satırını seçin (liste sıralandığından beri bu en büyük dosyadır!)
  6. awk: Dosya adını içeren ve özyinelemeli bir dizindeki en büyük dosya olan ikinci sütunu seçin.

Python çözümü

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Bu betiğin açıklanması biraz daha uzun sürüyor, ancak aslında bunu bir komut dosyası olarak kaydederseniz, komut satırında verilen ilk bağımsız değişkeni arayacak ve bu dizindeki en büyük dosyayı döndürecektir. Betik hata kontrolü yapmaz, ancak Python'da buna nasıl yaklaşacağınız hakkında bir fikir vermelidir, bu size bu problemi çözmede bağımsız bir platform sunar.



0

Artan sırayla boyuta sahip klasörlere sahip olmak için sort seçeneğiyle aşağıdaki komutu deneyin

du -sh * | sort -sh


-1

AIX ve HP-UX dışında herhangi bir platformda çalışan bir şey:

find . -ls | sort +6 | tail
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.