Cara daftar semua file yang dipesan berdasarkan ukuran

241

Saya ingin membuat daftar semua file dalam urutan besar ke kecil dan file-file itu dapat hadir di mana saja dalam folder tertentu.

Joe
sumber
5
dari man ls:-S sort by file size
ctrl-alt-delor
Maksud Anda “file-file tersebut ada di direktori ini”, atau “file-file tersebut mungkin ada di sub-direktori”.
ctrl-alt-delor
Jika Anda dapat / ingin menggunakan alat GUI, lihat QDirStat , sebelumnya KDirStat .
RhinoDevel

Jawaban:

290

Cukup gunakan sesuatu seperti:

ls -lS /path/to/folder/

Capital S .

Ini akan mengurutkan file berdasarkan ukuran.

Lihat juga:

man ls

-S     sort by file size

Jika Anda ingin mengurutkan dalam urutan terbalik , cukup tambahkan -rsakelar.

Memperbarui:

Untuk mengecualikan direktori (dan asalkan tidak ada nama file atau target symlink yang mengandung karakter baris baru):

ls -lS | grep -v '^d' 

Pembaruan 2:

Saya melihat sekarang bagaimana ia masih menunjukkan tautan simbolis, yang bisa berupa folder. Tautan simbolik selalu dimulai dengan huruf l, seperti pada tautan.

Ubah perintah untuk memfilter untuk a -. Ini seharusnya hanya meninggalkan file biasa:

ls -lS | grep '^-'

Di sistem saya ini hanya menampilkan file biasa.

pembaruan 3:

Untuk menambahkan rekursi, saya akan meninggalkan penyortiran baris ke sortperintah dan menyuruhnya menggunakan kolom ke-5 untuk disortir.

ls -lR | grep '^-' | sort -k 5 -rn

-rnartinya Balik dan numerik untuk mendapatkan file terbesar di atas. Sisi bawah dari perintah ini adalah tidak menunjukkan path lengkap file.

Jika Anda benar-benar membutuhkan path lengkap file, gunakan sesuatu seperti ini:

find . -type f  -exec du -h {} + | sort -r -h

The findperintah rekursif akan menemukan semua file dalam semua sub direktori dari .dan panggilan du -h(yang berarti penggunaan disk -humanreadable ) dan kemudian mengurutkan output lagi. Jika find/ sortAnda tidak mendukung -h, ganti dengan du -kdan sort -rn. Perhatikan bahwa ukuran dan penggunaan disk bukanlah hal yang sama.

delh
sumber
5
dumemberikan penggunaan disk yang berbeda dari ukuran file. Dengan (GNU) du -h, pengurutan numerik tidak akan berfungsi (Anda perlu -hopsi GNU untuk mengurutkan). xargs mengharapkan daftar kata-kata yang mungkin dikutip sebagai input sehingga tidak akan berfungsi jika nama file mengandung karakter kosong atau dikutip.
Stéphane Chazelas
1
Saya melihat bahwa -S tidak urutan ukuran menurun, bagaimana dengan urutan naik?
demongolem
3
Berikut @ StéphaneChazelas, ini bekerja untuk saya: find . -type f -print0 | xargs -0 du -h | sort -rh. Jika Anda hanya ingin mengatakan yang terbesar 30 file: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543
Hai! Bisakah Anda jelaskan + |sintaksisnya + | sort -r -h?
Victor
@ Viktor, silakan lihat unix.stackexchange.com/questions/195939/… .
Hew Wolff
25

Anda dapat menggunakan sesuatu seperti temukan dan urutkan.

find . -type f -ls | sort -r -n -k7

( -lsopsi ini tidak standar tetapi ditemukan di banyak implementasi implementasi, tidak hanya GNU satu. Di GNU find dan lainnya, ia menampilkan sesuatu yang mirip ls -lidengan beberapa pengecualian, misalnya file dengan ACL tidak ditandai dengan +)

Jika nama file dapat berisi karakter baris baru, dengan GNU find dan GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Mark Cohen
sumber
Ini mengasumsikan kolom "grup" (dari -l) tidak mengandung spasi apa pun (maka -k 7 parameter), tetapi belum tentu demikian.
kolistivra
1
kenapa tidak sekadar mencari ... -print0 | semacam -zk7rn0?
Andre de Miranda
10

Dengan zsh dan GNU ls:

ls -ldU -- **/*(.OL)

Di mana (.OL)adalah kualifikasi gumpal , .untuk memilih regular hanya file, OLuntuk membalikkan order by panjang (ukuran file, o untuk urutan menaik, Ountuk turun).

(perhatikan bahwa versi zsh yang lebih lama memiliki masalah dengan ukuran file lebih dari 2 ^ 32).

Beberapa sistem operasi memiliki batasan ukuran daftar argumen yang diteruskan ke suatu perintah. Dalam hal ini, Anda perlu:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Jika Anda hanya ingin daftar file dan bukan output detail, lakukan saja:

print -rl -- **/*(.OL)

Jika Anda ingin menyertakan file tersembunyi (yang namanya dimulai dengan titik, kecuali .dan ..) dan mencari di direktori tersembunyi juga, tambahkan Dkualifikasi globbing:

print -rl -- **/*(.DOL)
Stéphane Chazelas
sumber
apa yang .OLdilakukan? Apakah itu bagian dari perintah?
alpha_989
@ alpha_989, lihat edit
Stéphane Chazelas
Terima kasih atas penjelasannya, Stephane .. Namun, untuk beberapa alasan .. perintahnya tidak berfungsi pada workstation saya .. Saya menggunakan ls (GNU coreutils) 8.25dan zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Apakah hanya berfungsi untuk versi lsdan tertentu zsh?
alpha_989
@ alpha_989, dengan cara apa itu tidak berhasil untuk Anda? Ini berfungsi untuk saya dengan versi yang sama dan tidak ada dalam kode yang tidak akan berfungsi dalam versi dari 15 tahun yang lalu setidaknya.
Stéphane Chazelas
9

Daftar file menurut ukuran yang naik adalah:

ls -lSr

Opsinya adalah:

  • l: panjang, menunjukkan rincian pengguna, grup, atribut lainnya, tanggal, dll.
  • S: daftar pesanan berdasarkan ukuran (turun secara default)
  • r: membalik urutan daftar
Tukang roti
sumber
Maukah Anda menjelaskan opsi untuk meningkatkan kualitas jawaban?
Rui F Ribeiro
6

Mengatakan bahwa "file-file itu dapat hadir di mana saja dalam folder tertentu" menyiratkan bahwa Anda ingin secara rekursif turun semua direktori (folder) dalam direktori awal (folder). Inilah yang finddimaksudkan untuk dilakukan:

find . -type f -exec ls -lSd {} +

Ini "menemukan" semua file di direktori kerja saat ini ( .). Untuk setiap file yang ditemukan, lsproses dijalankan untuk mengurutkan objek yang ditemukan dalam urutan ukuran. The +terminator ke -execpenyebab beberapa argumen akan disahkan sebagai daftar ke ls. Kecuali jika direktori Anda (folder) berisi sejumlah besar file, Anda harus memiliki satu daftar (dan dengan demikian satu proses bercabang), mengarah ke hasil yang Anda inginkan.

JRFerguson
sumber
1
ini bagus karena memungkinkan Anda untuk menggunakan pengubah -h pada ls untuk menunjukkan ukuran file yang bagus
shmish111
4

Tampilan daftar file dalam urutan terbalik: ls -lSrh

Untuk pesanan naik: ls -lSh

pengguna174839
sumber
1
+1 untuk menggunakan flag -h untuk output ramah-manusia.
computingfreak
2

Saya menulis sesuatu sejauh ini beberapa waktu lalu. Anda bisa memberikan argumen untuk menentukan berapa banyak file yang harus didaftar, atau cukup ketik big, dalam hal apa Anda mendapatkan 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
Emanuel Berg
sumber
2

Coba ini, ini berfungsi baik untuk saya.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Meskipun tidak jawaban yang sempurna tetapi bekerja sampai batas tertentu

$ ls -lS |grep  '^-' | head -n 6 
Sand1512
sumber
1
awk berfungsi dengan baik jika nama file tidak mengandung spasi.
Eir Nym
ya .. gunakan 'sed' dan ganti spasi dengan garis bawah? jika itu membantu
Sand1512
Tidak, saya gunakan seduntuk memangkas output
Eir Nym
1

Menambahkan ke jawaban delh dan komentar Stéphane Chazelas ...

find -print0dikombinasikan dengan xargs -0menambahkan dukungan untuk blanks / spasi / whatnots.

du -h | sort -rn tidak mengurutkan dengan benar antara beberapa byte yang berbeda, misalnya 1.1M akan muncul setelah 128K, yang salah

sort -rh (--human-numeric-sort) menangani itu, tetapi hanya berfungsi pada versi GNU.

Perintah di bawah ini akan memberikan output yang diinginkan.

Dapat dibaca oleh manusia, di GNU's sort / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

Dalam satuan kilobyte, pada BSD / OSX / lainnya:

find . -type f -print0 | xargs -0 du -k | sort -rn

Untuk BSD / OSX, juga melihat https://unix.stackexchange.com/a/188375/82895 .

djule5
sumber
1

Sebagai variasi dari pertanyaan awal, jika Anda ingin melihat ukuran kumulatif file dalam subdirektori:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Ukuran akan ditampilkan dalam Megabytes ( mdalam du -sm). Nilai lain yang diterima oleh duadalah -kuntuk kilobyte, -guntuk gigabyte. Penggunaan -huntuk tampilan yang dapat dibaca manusia tidak dimungkinkan karena akan merusak penyortiran.

Berikut adalah versi yang digunakan seduntuk menambahkan Muntuk megabyte:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Direktori untuk ditampilkan diatur melalui ${1:-.}yang akan menggunakan argumen baris perintah pertama jika disediakan, atau menggunakan direktori saat ini jika dipanggil tanpa argumen.

CATATAN: Ini bisa memakan waktu lama dengan banyak file. Opsi -type dhanya akan mendaftar subdirektori dan mengecualikan file dalam folder saat ini; jika Anda juga ingin melihat file di folder saat ini kemudian hapus.

Catatan: Anda mungkin ingin menggunakan ncduyang tersedia di sebagian besar repo linux (di ubuntu / debian apt install ncdu) dan juga di osx ( brew install ncdu).

ccpizza
sumber