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.



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.


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


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'

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)

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

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.


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


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
}

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 

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 .


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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.