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 -S
ama bu dizinleri de listeliyor.
Ben de kullanmayı denedim find
.
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 -S
ama bu dizinleri de listeliyor.
Ben de kullanmayı denedim find
.
Yanıtlar:
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
Komut du -ah DIR
, verilen bir dizindeki tüm dosya ve dizinlerin listesini üretecektir DIR
. Bu -h
benim 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 -6
yerine 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
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ı?
/
yok - mesela /home/saml/Downloads/audible
bir 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
.
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 find
ile şunları yapabilirsiniz:
find . -type f -printf "%s\t%p\n" | sort -n
Gönderen man find
bir 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
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 -h
için sort
yüklemek ettik böylece, OSX / BSD kullanılamaz sort
dan 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
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
find . -type f
dosyaları bulur ... özyinelemeli çalışır, haklısın, ama bulduğu tüm dosyaları listeler, dizinleri değil
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 -S
seçeneğini kullanabilirsiniz . Bazı ls
uygulamalarda , listeyi sıralamama -U
seçeneği de vardır ls
( zsh
burada zaten boyuta göre sıralanmıştır ).
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
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# 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}'
# (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:
#!/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.
Artan sırayla boyuta sahip klasörlere sahip olmak için sort seçeneğiyle aşağıdaki komutu deneyin
du -sh * | sort -sh