Bagaimana menemukan file terbesar dalam sebuah direktori dan subdirektorinya?

102

Kami baru memulai kelas UNIX dan mempelajari berbagai perintah Bash. Penugasan kami melibatkan melakukan berbagai perintah pada direktori yang memiliki sejumlah folder di bawahnya juga.

Saya tahu cara membuat daftar dan menghitung semua file biasa dari folder root menggunakan:

find . -type l | wc -l

Tapi saya ingin tahu ke mana harus pergi dari sana untuk menemukan file terbesar di seluruh direktori. Saya telah melihat sesuatu tentang sebuah duperintah, tetapi kami belum mempelajarinya, jadi dalam repertoar hal-hal yang telah kami pelajari, saya berasumsi bahwa kami perlu menghubungkannya ke ls -tperintah.

Dan maafkan saya jika 'istilah' saya tidak benar, saya masih terbiasa!

Rekson
sumber
2
Jika Anda mengetahui suatu perintah, tetapi tidak yakin bagaimana menggunakannya, coba ketik mandiikuti dengan perintah yang Anda minati. Atas akan muncul entri manual yang bagus untuk perintah itu (tekan quntuk kembali ke baris perintah).
Bukit pasir
terkait: unix.stackexchange.com/questions/140367/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

126

Mengutip dari ini link-

Jika Anda ingin mencari dan mencetak 10 nama file terbesar (bukan direktori) di direktori tertentu dan subdirektorinya

$ find . -printf '%s %p\n'|sort -nr|head

Untuk membatasi pencarian pada direktori saat ini, gunakan "-maxdepth 1" dengan find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Dan untuk mencetak 10 "file dan direktori" terbesar:

$ du -a . | sort -nr | head

** Gunakan "head -n X" alih-alih satu-satunya "head" di atas untuk mencetak X file terbesar (dalam semua contoh di atas)

tamsler
sumber
1
Mengapa "du -a. | Sort -nr | head" mengembalikan dua kali lipat jumlah KB daripada ukuran file sebenarnya?
xxjjnn
6
Ah, Anda perlu menambahkan opsi 'k' atau ini menunjukkan kelipatan 512 byte daripada 1024. du -ak
xxjjnn
2
untuk yang pertama, bagaimana Anda mendapatkan ukuran dalam format yang dapat dibaca manusia?
Bluz
@Bluz Saya akan mencoba mengganti '%s %p\n'dengan '%p\n'dan menambah |xargs ls -lhakhir
Duncan X Simpson
6
Solusi pertama tidak bekerja pada OS X untuk saya, jadi saya akhirnya menggunakan hack cepat untuk menyaring direktori dari solusi ketiga: du -am . | sort -nr | grep '\..*\.' | head. Ini muntuk menampilkan ukuran file dalam megabyte dan digunakan grepuntuk menunjukkan baris dengan setidaknya dua titik, yang pertama ada di ./jalur, yang kedua di ekstensi file, mis .mov.
psmith
63

Untuk menemukan 25 file teratas di direktori saat ini dan subdirektorinya:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Ini akan menampilkan 25 file teratas dengan mengurutkan berdasarkan ukuran file melalui perintah piped "sort -nr -k5".

Sama tetapi dengan ukuran file yang dapat dibaca manusia:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25

xpros
sumber
10
find . -type f | xargs ls -lS | head -n 1

keluaran

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Jika Anda hanya ingin nama file:

find . -type f | xargs ls -1S | head -n 1

Ini menghindari penggunaan awkdan memungkinkan Anda menggunakan flag apa pun yang Anda inginkan ls.

Peringatan . Karena xargsmencoba menghindari pembuatan baris perintah yang terlalu panjang, ini mungkin gagal jika Anda menjalankannya di direktori dengan banyak file karena lsakhirnya mengeksekusi lebih dari sekali. Ini bukan masalah yang tidak dapat diatasi (Anda dapat mengumpulkan head -n 1output dari setiap lspemanggilan, dan menjalankannya ls -Slagi, berulang hingga Anda memiliki satu file), tetapi ini agak merusak pendekatan ini.

nneonneo
sumber
maaf xargs, saya telah mengabaikan Anda +1
Steve
2
untuk menangani nama file dengan spasi, gunakanfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo
Ini menemukan file terbesar hanya dalam batch pertama yang xargstelah dieksekusi. Untuk memperbaikinya menambahkan menyortir: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Bekerja di OSX untuk saya.
psmith
10

Tidak ada perintah sederhana yang tersedia untuk mengetahui file / direktori terbesar pada sistem file Linux / UNIX / BSD. Namun, kombinasi dari tiga perintah berikut (menggunakan pipa) Anda dapat dengan mudah mengetahui daftar file terbesar:

# du -a /var | sort -n -r | head -n 10

Jika Anda ingin lebih banyak keluaran yang dapat dibaca manusia, coba:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Dimana,

  • Var adalah direktori yang ingin Anda cari
  • du command -h option: menampilkan ukuran dalam format yang dapat dibaca manusia (misalnya, 1K, 234M, 2G).
  • du command -s option: hanya menampilkan total untuk setiap argumen (ringkasan).
  • du perintah -x opsi: lewati direktori pada sistem file yang berbeda.
  • sort perintah -r opsi: membalikkan hasil perbandingan.
  • urutkan perintah -h opsi: bandingkan angka yang dapat dibaca manusia. Ini hanya opsi khusus jenis GNU.
  • perintah head -10 ATAU -n 10 opsi: tampilkan 10 baris pertama.
Kalpana
sumber
Saya lebih suka perintah ke-2 tetapi pada osx, tidak ada opsi -h untuk versi sortir yang diinstal. Seharusnya untuk mac: du -hsx * | sort -rn | kepala -10
Yann VR
1
Menyukai perintah kedua itu! Yang terbaik dari semua yang pernah saya coba - saya akan menyimpannya untuk nanti.
CodeMouse92
Menjelaskan perintah dengan jelas secara detail +1
Harish
8

Ini mencantumkan file secara rekursif jika itu file normal, diurutkan berdasarkan bidang ke-7 (yang merupakan ukuran dalam findoutput saya ; periksa milik Anda), dan hanya menampilkan file pertama.

find . -type f -ls | sort +7 | head -1

Opsi pertama findadalah jalur awal untuk pencarian rekursif. Jenis fpencarian untuk file normal. Perhatikan bahwa jika Anda mencoba mengurai ini sebagai nama file, Anda mungkin gagal jika nama file berisi spasi, baris baru, atau karakter khusus lainnya. Opsi untuk sortjuga berbeda menurut sistem operasi. Saya menggunakan FreeBSD.

Solusi yang "lebih baik" tetapi lebih kompleks dan lebih berat adalah dengan findmelintasi direktori, tetapi mungkin menggunakan statuntuk mendapatkan detail tentang file, kemudian mungkin menggunakan awkuntuk menemukan ukuran terbesar. Perhatikan bahwa keluaran statjuga tergantung pada sistem operasi Anda.

ghoti
sumber
1
Apa +7arg yang dimaksudkan untuk dilakukan? Pada jenis mesin saya hanya mengeluh bahwa tidak dapat menemukan file bernama +7.
Bukit pasir
@ Dunes - Seperti yang saya katakan, periksa halaman manual sortdi sistem Anda. Saya menggunakan OS X 10.4 saat ini, di mana penggunaannya berasal dari jenis FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Perhatikan +POS [-POS2]. Ini juga berfungsi di versi FreeBSD saat ini.
ghoti
2
Sepertinya Anda memiliki program sortir yang berbeda dengan saya. Ini adalah halaman manual untuk program sortir saya - linux.die.net/man/1/sort Agar ini dapat bekerja pada mesin saya, Anda perlu secara eksplisit menggunakan -karg misalnya. sort -k 7. edit: oleh OSX 10.5 halaman manual untuk sort tampaknya telah berubah ke versi yang saya miliki.
Bukit pasir
1
@ Dunes - Itu semua jenis GNU, tetapi versi yang berbeda. The [+POS1] [-POS2]notasi hanya satu yang lebih tua. Sejauh yang saya tahu, notasi ini masih didukung oleh jenis GNU modern, meskipun sekarang saya lihat, tampaknya telah dihapus dari halaman manual sortir setelah sekitar versi 5.1. Anda dapat melihatnya di halaman manual untuk mengurutkan FreeBSD 4.11 . Saya rasa saya belum membaca halaman manual sort sejak sebelum FreeBSD 5.0 ​​dirilis!
ghoti
Juga, perhatikan bahwa +POS1menghitung parameter sortir dari nol, sedangkan -k POS1menghitung dari satu.
ghoti
6

Ini akan menemukan file atau folder terbesar di direktori kerja Anda saat ini:

ls -S /path/to/folder | head -1

Untuk menemukan file terbesar di semua sub-direktori:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
Steve
sumber
Saya pikir perilaku default ls adalah membuat daftar file dalam kolom (mis. Beberapa entri per baris), jadi yang pertama tidak hanya menemukan file terbesar. Sehubungan dengan perintah kedua Anda, ia hanya menemukan file terbesar di direktori yang diberikan dan bukan subdirektorinya.
Bukit pasir
@ Dunes: Anda benar, perintah pertama dapat menemukan direktori, tetapi bukan karena perilaku default ls. Dalam pengujian saya, -Sbendera akan mencantumkan satu file per baris. Saya telah mengoreksi perintah kedua. Semoga sekarang ini bukti penuh. Terima kasih.
Steve
4

Di Solaris saya menggunakan:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

atau

find . -type f -ls | sort -nrk7 | head -1 #unformatted

karena apa pun yang diposting di sini tidak berfungsi. Ini akan menemukan file $PWDdan subdirektori terbesar.

rindeal
sumber
2

Coba satu baris berikut (tampilkan 20 file terbesar teratas):

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

atau (ukuran yang dapat dibaca manusia):

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

Bekerja dengan baik di Linux / BSD / OSX dibandingkan dengan jawaban lain, karena -printfopsi find tidak ada di OSX / BSD dan statmemiliki parameter berbeda tergantung pada OS. Namun perintah kedua untuk bekerja di OSX / BSD dengan benar (seperti yang sorttidak dimiliki -h), instal sortdari coreutilsatau hapus -hdari lsdan gunakan sort -nrsebagai gantinya.

Jadi, alias ini berguna untuk dimiliki di file rc Anda :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
kenorb
sumber
Ini hanya menampilkan nama file tanpa jalur, jadi tidak terlalu membantu untuk benar-benar menemukan file terbesar.
psmith
Bagi saya di atas, saya memiliki file yang sangat besar, tetapi pada akhirnya ini tidak memberi saya file yang benar
Borislav Markov
2

Coba perintah berikut:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Ini akan mencetak nama dan ukuran file terbesar dan lebih dari 500M. Anda dapat memindahkan if($1 > 500000), dan itu akan mencetak file terbesar di direktori.

zjhui
sumber
1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

atau

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'

Ansgar Wiechers
sumber
0

Skrip ini menyederhanakan menemukan file terbesar untuk tindakan lebih lanjut. Saya menyimpannya di direktori ~ / bin saya, dan meletakkan ~ / bin di $ PATH saya.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size
jlettvin.dll
sumber
0

Itu cara yang lebih sederhana untuk melakukannya:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Dan Anda akan mendapatkan ini: 8445 examples.desktop

Andrii Kovalchuk
sumber
Apa yang 1***harus dilakukan di akhir? Saya mendapatkan kesalahan "tidak ditemukan kecocokan" untuk argumen itu.
pengguna4815162342
0

Solusi Linux: Misalnya, Anda ingin melihat semua daftar file / folder dari direktori home (/) Anda menurut ukuran file / folder ( Urutan menurun ).

sudo du -xm / | sort -rn | lebih

Monir
sumber
0

Untuk membuat daftar file yang lebih besar dalam sebuah folder

ls -sh /pathFolder | sort -rh | head -n 1

Output dari ls -shadalah ukuran sdan htampilan ukuran file yang dapat dimengerti manusia .

Anda bisa menggunakan ls -shS /pathFolder | head -n 1. Yang lebih besar Sdari lssudah memesan daftar dari file yang lebih besar ke yang lebih kecil tetapi hasil pertama adalah jumlah semua file di folder itu. Jadi jika Anda hanya ingin membuat daftar file yang lebih besar, satu file, Anda perlu head -n 2dan memeriksa "hasil baris kedua" atau gunakan contoh pertama dengan ls sort head.

José Pacheco
sumber
0
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
Borislav Markov
sumber