Temukan file atau direktori terbesar

10

Perintah mana yang akan mencetak ukuran semua file dan direktori dalam direktori tmp (termasuk yang tersembunyi) dan mengurutkannya berdasarkan ukuran dari yang terbesar hingga yang terkecil dalam format yang dapat dibaca manusia (mis. 2 GB)?

Outputnya bisa sebagai berikut:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Saya mencoba menggunakan lsdan duperintah tetapi tidak dapat menemukan switch yang tepat.

xralf
sumber

Jawaban:

7

Ini adalah perbaikan cepat, gunakan du + sort. Coba ini:

du -smc * | sort -n

Ini akan mengabaikan file tersembunyi, tapi itu perbaikan mudah lainnya:

du -smc .[^.] .??* * | sort -n

Ini dapat menyebabkan peringatan tentang jika satu atau lebih pola di atas tidak cocok dengan file. Pola pertama .[^.]cocok dengan semua nama file dua karakter dimulai dengan. kecuali untuk .., pola kedua, .??*cocok dengan ketiga huruf atau lebih nama file yang dimulai dengan. dan * cocok dengan semua file yang tidak dimulai. Untuk daftar yang lebih canggih seperti menemukan semua file lebih besar dari X di seluruh sistem file, atau mempertahankan daftar pertumbuhan sistem file, saya memiliki beberapa skrip shell DIY yang saya tulis dan dapat dibagikan jika Anda tertarik.

penguin359
sumber
Terima kasih. Saya tertarik dengan skrip Anda jika Anda akan baik.
xralf
1
Gunakan sort -nrjika Anda menginginkan nilai terbesar di atas.
LawrenceC
3

Untuk membuat daftar file di mana saja di bawah /tmp, diurutkan berdasarkan ukuran:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Untuk daftar file dan pohon direktori langsung di bawah /tmp, diurutkan berdasarkan ukuran:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Untuk daftar semua file dan pohon direktori di mana saja di bawah /tmp, diurutkan berdasarkan ukuran:

du -ak /tmp | sort -k1n -k2

(Contoh untuk mengilustrasikan perbedaan antara tiga perintah: jika ada file /tmp/dir/file, daftar perintah pertama /tmp/dir/file, daftar kedua /tmp/dir, dan daftar ketiga keduanya.)

Semua perintah di atas menunjukkan ukuran dalam kilobyte. Sementara GNU du dapat menampilkan ukuran yang “dapat dibaca manusia” (dengan k, M, G, dll. Pengganda), mengurutkannya adalah masalah lain. Cukup baru GNU coreutils (≥7.4) dapat melakukannya: cukup ganti du -kdengan du -hdan sort -k1n -k2dengan sort -k1h -k2. Jika tidak, inilah skrip awk mentah untuk dikonversi ke ukuran sufiks (pembulatan ke bawah); hanya pipa sortkeluaran di atas ke dalamnya.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih. Perintah-perintah itu berguna, tetapi saya hanya tertarik pada file dan direktori langsung di bawah tmp, bukan file dalam subdirektori
xralf
1
@ xralf: Kemudian gunakan hanya bentuk dupanggilan kedua .
Gilles 'SO- stop being evil'
Terlihat bagus, tetapi hasilnya lebih baik dengan MB dan GB saat forcefsck diposting.
xralf
3

Saya menggunakan alias berikut ini untuk itu: alias ds='du -x --all --max-depth=1 . | sort -n'

Ini mencetak ukuran semua file dan subdirektori level 1 dari dir saat ini.

rvs
sumber
Ini solusi singkat yang bagus, tetapi hanya mencetak direktori.
xralf
Oh, maaf, kamu benar. Saya tidak pernah menghadapi masalah ini dengan file. Namun, saya telah menemukan cara membuatnya berfungsi dengan file: using --all swicth.
rvs
Solusi tepat yang bagus. penguin359 memiliki sedikit lebih baik karena ini menunjukkan ukuran dalam MB. Yang terbaik adalah solusi forcefsck tetapi solusinya menghilangkan direktori dengan spasi.
xralf
1

Dengan versi saat ini dari gnu sort (dan meminjam pola file @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Dengan semacam versi yang lebih lama

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: menambahkan -S parameter duuntuk tidak menyertakan subdirektori.

forcefsck
sumber
Saya ingin ruang disk yang digunakan oleh file dan direktori (ukuran total data di dalamnya) langsung di bawah tmp (bukan subdirektori). Perintah sortir saya tidak memiliki opsi -h.
xralf
Saya tidak 100% yakin apa yang Anda maksudkan, karena Anda sudah menerima jawaban dengan pemilihan pola file yang sama. Mengedit posting saya untuk tidak memasukkan subdir. Jika Anda menginginkan ukuran yang tampak dan bukan ruang disk sebenarnya yang digunakan, Anda dapat menambahkan --apparent-sizeke du parameter.
forcefsck
Sekarang berfungsi dengan baik. Saya hanya perlu mencari GB dan kemudian MB, tapi itu tidak masalah.
xralf
Saya memiliki huruf satuan dalam urutan yang salah, sekarang diperbaiki. Jika Anda ingin urutan dari besar ke kecil, ubah urutan huruf satuan dan tambahkan -r untuk mengurutkan.
forcefsck
Saya perhatikan, lupa untuk mencetak ukuran direktori (tanpa awalan.)
xralf
0

PEMBARUAN: Saya telah menghapus skrip sebelumnya. Ini adalah versi baru, menggunakan dudan awk (yang sebelumnya digunakan treedan sed)

Ini adalah output dari: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Ini skripnya

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
Peter.O
sumber
Ketika Anda mengatakan ukuran semua file dan direktori , maksud Anda ruang yang digunakan setiap item pada disk (mis. Pada sistem file Ubuntu ext4 saya , direktori kosong membutuhkan ruang disk 4k, dan file yang berukuran lebih kecil dari 4k membutuhkan 4k Potongan penjatahan minimum adalah 4k) .. atau maksud Anda jumlah data dalam setiap file, misalnya 100 (byte) .. Dan untuk direktori, apakah Anda ingin mengetahui total data file dalam direktori itu .. Jika Anda ingin ukuran data di dalam file, lalu treelakukan itu. jika Anda ingin ruang disk yang digunakan, maka duapakah itu ... ( treetidak
menjumlahkan
'du' adalah pilihan yang lebih baik ... Saya baru saja memperhatikan man du, bahwa ia juga dapat melaporkan "ukuran file semu" .... The apparent size of a file is the number of bytes reported by wc -c 'pada file biasa, atau lebih umum, ls -l --block-size=1' or stat --format =% s '. Misalnya, file yang berisi katazoo' with no newline would, of course, have an apparent size of 3.
Peter.O
Saya ingin lebih banyak ruang disk yang digunakan oleh file dan direktori (ukuran total data di dalamnya) langsung di bawah tmp (bukan subdirektori)
xralf
Maaf, saya belum dalam tahap scripting shell saya bisa memahaminya, jadi saya membiarkannya kepada pengguna lain untuk memutuskan seberapa baik jawaban itu. Terima kasih atas kerjamu. Saya akan mempelajarinya ketika saya lebih baik.
xralf
0
find /tmp -exec du {} + | sort -nr | less 

menunjukkan file terbesar terlebih dahulu, sehingga Anda dapat melakukannya qsegera setelah Anda cukup melihatnya.

Pengguna tidak diketahui
sumber