Menggunakan ls untuk membuat daftar direktori dan ukuran totalnya

828

Apakah mungkin untuk digunakan lsdi Unix untuk membuat daftar ukuran total dari suatu sub-direktori dan semua isinya sebagai lawan dari yang biasanya 4K(saya berasumsi) hanyalah file direktori itu sendiri?

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

Setelah memeriksa halaman manual, saya menjadi kosong.

kmorris511
sumber
4
Anda ingin menggunakan du-s sebagai gantinya
senjata
21
Dalam mencari bebek:alias ducks='du -cksh * | sort -hr | head -n 15'
Sebi

Jawaban:

1550

Coba sesuatu seperti:

du -sh *

versi pendek dari:

du --summarize --human-readable *

Penjelasan:

du: D isk U sage

-s: Menampilkan ringkasan untuk setiap file yang ditentukan. (Setara dengan -d 0)

-h: Keluaran "Dapat dibaca manusia". Gunakan sufiks unit: B yte, K ibibyte (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) dan P ebibyte (PiB). (BASE2)

Molf
sumber
55
Juga -c (menghasilkan grand total) bagus.
meridius
50
du --max-depth 1 hanya menampilkan ukuran file / folder sedalam 1 di dalam pohon, tidak ada lagi kekacauan dan mudah menemukan folder besar di dalam folder.
CousinCocaine
12
bagaimana cara memasukkan file tersembunyi juga?
Zakaria Braksa
5
@ Zak di zsh Anda dapat menggunakan *(D)untuk mencocokkan file yang tersembunyi ( d ) dengan file normal. Saat menggunakan bash, Anda bisa menggunakan * .[!.]*untuk mencocokkan keduanya.
Sebi
22
Untuk mendapatkan gambaran yang jelas tentang kemana ruang bergerak, du -sch * .[!.]* | sort -rhsangat bagus (tampilkan keluaran yang diurutkan) Di mac lakukan: brew install coreutilsdan kemudiandu -sch * .[!.]* | gsort -rh
Guig
319

du -sk * | sort -nakan mengurutkan folder berdasarkan ukuran. Bermanfaat saat ingin membersihkan ruang ..

Penggali kuburan
sumber
11
Tambahkan | tail -runtuk disortir berdasarkan yang terbesar terlebih dahulu.
Phrogz
68
sort -rnmengurutkan hal-hal dalam urutan angka terbalik. sort -rn | head -n 10hanya akan menampilkan beberapa teratas, jika itu menarik.
AgileTillIDie
14
sort -rhakan bekerja dengan baik du -cksh *karena memilah unit yang dapat dibaca manusia.
Sebi
@Sebi -h bukan parameter yang valid untuk mengurutkan pada Mac
anon58192932
@ Sebi juga -c tidak perlu, du -ksh | sort -rnsama dengan du -cksh | sort -rn. Sama seperti du -kshsama dengan du -cksh.
hello_there_andy
108
du -sh * | sort -h

Ini akan ditampilkan dalam format yang dapat dibaca manusia.

pengguna2969885
sumber
6
Lebih lanjut tentang sort -hdi sini: gnu.org/software/coreutils/manual/... Ini terutama sana untuk menyortir 103K, 102M, 1.1Gdll Hal ini harus tersedia pada banyak sistem saat ini, tapi tidak semua.
Evgeni Sergeev
duh -shm * | semacam -n?
std''OrgnlDave
10
berfungsi dengan baik, satu tambahan kecil du -sh * | sort -rh(-r untuk daftar folder yang lebih besar dulu)
artm
Untuk memasukkan file / direktori tersembunyi; du -sh $(ls -A) | sort -h
jmd_dk
55

Untuk daftar direktori terbesar dari direktori saat ini dalam format yang dapat dibaca manusia:

du -sh * | sort -hr

Cara yang lebih baik untuk membatasi jumlah baris bisa dilakukan

du -sh * | sort -hr | head -n10

Di mana Anda dapat menambah akhiran -nbendera untuk membatasi jumlah baris yang terdaftar

Sampel:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

Itu membuatnya lebih mudah untuk dibaca :)

Jay Chakra
sumber
27

Untuk menampilkannya dalam ls -lhformat, gunakan:

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Kode awk menjelaskan:

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

Output sampel:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd
Sebi
sumber
cara apa pun untuk mengurutkan output ini? Juga bagi siapa pun di mac ini berfungsi dengan baik jika Anda menghapus--color=no
anon58192932
@ anon58192932 Anda dapat menyalurkan output ke sort --key=5,5huntuk menyortir 'unit yang dapat dibaca manusia' dari kolom kelima
Sebi
mengembalikan sort: stray character in field spec: invalid field specification 5,5h'`. Saya benar-benar benci macs kadang-kadang = \
anon58192932
@ anon58192932 Anda dapat mengajukan pertanyaan terkait mac, saya yakin ada seseorang yang bisa membantu. Pertanyaan ini ditandai sebagai GNU / linux
Sebi
2
apakah ada cara untuk mempertahankan warna menggunakan jawaban ini?
Pablo Canseco
20

Perintah yang Anda inginkan adalah 'du -sk' du = "penggunaan disk"

Bendera -k memberi Anda output dalam kilobyte, daripada du default dari sektor disk (blok 512-byte).

Bendera -s hanya akan mencantumkan hal-hal di direktori tingkat atas (yaitu, direktori saat ini, secara default, atau direktori yang ditentukan pada baris perintah). Aneh bahwa du memiliki perilaku yang berlawanan dari ls dalam hal ini. Secara default du akan secara rekursif memberi Anda penggunaan disk setiap sub-direktori. Sebaliknya, ls hanya akan memberikan daftar file dalam direktori yang ditentukan. (ls -R memberi Anda perilaku rekursif.)

Keith Smith
sumber
Mencoba ini pada direktori root, ia masih mencoba untuk membuat daftar subdirektori, menghasilkan banyak pesan.
Nagev
14

Masukkan deklarasi fungsi shell ini dalam skrip inisialisasi shell Anda:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Saya menyebutnya dulskarena menampilkan output dari keduanya dudan ls(dalam urutan itu):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Penjelasan:

The pasteutilitas menciptakan kolom dari input sesuai dengan spesifikasi yang Anda berikan. Diberikan dua file input, itu menempatkan mereka berdampingan, dengan tab sebagai pemisah.

Kami memberikan output du -hs -- "$@" | cut -f1sebagai file pertama (input stream really) dan output ls -ld -- "$@"sebagai file kedua.

Dalam fungsi tersebut, "$@"akan mengevaluasi daftar semua argumen baris perintah, masing-masing dalam tanda kutip ganda. Karena itu ia akan memahami karakter globbing dan nama jalur dengan spasi dll.

Minus ganda ( --) menandakan akhir opsi baris perintah ke dudan ls. Tanpa ini, mengatakan duls -lakan membingungkan dudan opsi apa pun duyang lstidak dimiliki akan membingungkan ls(dan opsi yang ada di kedua utilitas mungkin tidak berarti hal yang sama, dan itu akan sangat berantakan).

The cutsetelah duhanya memotong kolom pertama dari du -hsoutput (ukuran).

Saya memutuskan untuk meletakkan duoutput di sebelah kiri, kalau tidak saya harus mengelola kolom kanan goyah (karena panjangnya nama file yang bervariasi).

Perintah tidak akan menerima bendera baris perintah.

Ini telah diuji di keduanya bashdan di ksh93. Itu tidak akan bekerja dengan /bin/sh.

Kusalananda
sumber
Itu bagus. Izin dan ukuran dalam satu baris
Ben
7

Saya selalu menggunakan du -sk( -kflag menunjukkan ukuran file dalam kilobyte) sebagai gantinya.

Crenshaw
sumber
5
ini harus berupa komentar, memberikan info tambahan untuk jawaban diterima yang lebih benar dan lebih baik dijelaskan oleh @molf. Seharusnya tidak dianggap sebagai jawaban sendiri
code_monk
7
du -h --max-depth=1 . | sort -n -r
StarDust
sumber
1
du -h -d 1 untuk kedalaman maksimum 1. Bentuk pendek.
possumkeys
7

ncdu ncurses du

Utilitas CLI yang luar biasa ini memungkinkan Anda untuk dengan mudah menemukan file dan direktori besar secara interaktif.

Sebagai contoh, dari dalam pohon proyek terkenal kami lakukan:

sudo apt-get install ncdu
ncdu

Hasilnya:

masukkan deskripsi gambar di sini

Lalu, saya masuk ke bawah dan ke kanan pada keyboard saya untuk masuk ke /driversfolder, dan saya melihat:

masukkan deskripsi gambar di sini

ncdu hanya menghitung ukuran file secara rekursif sekali pada saat startup untuk seluruh pohon, sehingga efisien.

"Total penggunaan disk" vs "Ukuran nyata" adalah analog dengan du, dan saya telah menjelaskannya di: mengapa output dari `du` sering sangat berbeda dari` du -b`

Beranda proyek: https://dev.yorhel.nl/ncdu

Pertanyaan-pertanyaan Terkait:

Diuji di Ubuntu 16.04.

ncdu penggunaan non-interaktif

Fitur keren lainnya ncduadalah Anda dapat terlebih dahulu membuang ukuran dalam format JSON, dan kemudian menggunakannya kembali.

Misalnya, untuk menghasilkan menjalankan file:

ncdu -o ncdu.json

dan kemudian memeriksanya secara interaktif dengan:

ncdu -f ncdu.json

Ini sangat berguna jika Anda berurusan dengan sistem file yang sangat besar dan lambat seperti NFS.

Dengan cara ini, Anda dapat mengekspor hanya sekali pertama, yang dapat memakan waktu berjam-jam, dan kemudian menjelajahi file, berhenti, menjelajah lagi, dll

Format output hanya JSON, sehingga mudah digunakan kembali dengan program lain juga, misalnya:

ncdu -o -  | python -m json.tool | less

memperlihatkan struktur data tree direktori sederhana:

[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },

Diuji di Ubuntu 18.04.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
Luar biasa. Terima kasih telah berbagi!
Frank Fu
Saya setuju, ncdu adalah cara untuk pergi ... tetapi apakah Anda tahu apakah mungkin untuk mencari file JSON? Artinya, dapatkan path lengkap dari file / folder tertentu.
FGV
1
@ FGV Saya tidak berpikir ncdu dapat menampilkan itu, satu kemungkinan akan meretas skrip python sederhana yang mem-parsing JSON.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4

du -sch * di direktori yang sama.

John
sumber
4

Ini yang saya suka

pembaruan : Saya tidak suka yang sebelumnya karena tidak menampilkan file di direktori saat ini, itu hanya daftar direktori.

Contoh output untuk /vardi ubuntu:

sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var
meffect
sumber
3

Ini semua adalah saran bagus, tapi yang saya gunakan adalah:

du -ksh * | sort -n -r

-ksh pastikan file dan folder terdaftar dalam format yang dapat dibaca manusia dan dalam megabita, kilobyte, dll. Kemudian Anda mengurutkannya secara numerik dan membalikkannya sehingga menempatkan yang lebih besar terlebih dahulu.

Satu-satunya downside ke perintah ini adalah bahwa komputer tidak tahu bahwa Gigabyte lebih besar dari Megabyte sehingga hanya akan mengurutkan berdasarkan angka dan Anda akan sering menemukan daftar seperti ini:

120K
12M
4G

Berhati-hatilah untuk melihat unit.

Perintah ini juga berfungsi pada Mac (padahal sort -htidak misalnya).

kakubei
sumber
Jika Anda menghapus -hbendera dari duperintah, Anda memotong sisi buruknya
Carlos Ricardo
Atau Anda bisa menggunakan -hbukan -ndalam bentuk juga.
Sebi
atau hanya pipa melalui grep G
gforce89
3
du -S

du memiliki opsi lain yang bermanfaat: -S, --separate-dirsmengatakan du tidak menyertakan ukuran subdirektori - berguna pada beberapa kesempatan.

Contoh 1 - hanya menampilkan ukuran file dalam direktori:

du -Sh  * 
3,1G    10/CR2
280M    10

Contoh 2 - menunjukkan ukuran file dan subdirektori dalam direktori:

du -h  * 
3,1G    10/CR2 
3,4G    10
sopel
sumber
3

du -sm * | semacam -nr

Output berdasarkan ukuran

Amir
sumber
2

lihat duperintah untuk itu

Zappan
sumber
2

hanya peringatan, jika Anda ingin membandingkan ukuran file. du menghasilkan hasil yang berbeda tergantung pada sistem file, ukuran blok, ...

Mungkin saja ukuran file berbeda, misalnya membandingkan direktori yang sama pada hard disk lokal Anda dan perangkat penyimpanan massal USB. Saya menggunakan skrip berikut, termasuk ls untuk meringkas ukuran direktori. Hasilnya dalam byte yang memperhitungkan semua sub direktori.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"
Martin Wilde
sumber
1

Untuk menampilkan file direktori saat ini dan ukuran subdirektori secara rekursif:

du -h .

Untuk menampilkan informasi ukuran yang sama tetapi tanpa mencetak sub direktori mereka secara rekursif (yang bisa menjadi daftar besar), cukup gunakan opsi --max-depth :

du -h --max-depth=1 .
Pascal
sumber
1

Untuk sementara, saya menggunakan Nautilus (di desktop Gnome di RHEL 6.0) untuk menghapus file di folder rumah saya alih-alih menggunakan rmperintah di bash. Akibatnya, ukuran total ditunjukkan oleh

du -sh

tidak cocok dengan jumlah penggunaan disk setiap sub-direktori, ketika saya menggunakan

du -sh *

Butuh beberapa saat untuk menyadari Nautilus mengirim file yang dihapus ke folder Trash-nya, dan folder itu tidak tercantum dalam du -sh *perintah. Jadi, hanya ingin berbagi ini, kalau-kalau ada yang menghadapi masalah yang sama.

CrossEntropy
sumber
1

Hmm, cara terbaik adalah menggunakan perintah ini:

du -h -x / | sort -hr >> /home/log_size.txt

Maka Anda akan bisa mendapatkan semua folder ukuran di semua server Anda. Mudah membantu Anda menemukan ukuran terbesar.

Xanarus
sumber
1

Berikut ini mudah diingat

ls -ltrapR

daftar isi direktori

-Saya menggunakan format daftar panjang

-t Urutkan berdasarkan waktu modifikasi, terbaru dulu

-r, --reverse urutan terbalik sambil menyortir

-a, --semua jangan abaikan entri yang dimulai dengan.

-p, --indicator-style = slash append / indikator ke direktori

-R, - subdirektori daftar rekursif secara rekursif

https://explainshell.com/explain?cmd=ls+-ltrapR

NVRM
sumber
1

Jika Anda ingin lebih banyak kontrol atas daftar sizeyang ingin Anda daftarkan, Anda dapat menggunakan sakelar threshold( -t) seperti pada:

$ du -ht 1000000000 | sort --reverse

du- dIsk usage
h - format yang dapat dibaca manusia
t - ukuran ambang batas

Di sini, kami ingin membuat daftar semua direktori yang berukuran lebih dari 1GB.

$ du -ht 1G | sort --reverse

Penjelasan :

Unit yang dijelaskan dalam wiki mengikuti:

K, M, G, T, P, E, Z, Y (kekuatan 1024) atau
KB, MB, GB, TB, PB, EB, ZB, YB (kekuatan 1000).

kmario23
sumber
0

Saya mengalami masalah yang mirip dengan apa yang dijelaskan Martin Wilde, dalam kasus saya membandingkan direktori yang sama pada dua server yang berbeda setelah mirroring dengan rsync.

Alih-alih menggunakan skrip saya menambahkan -bbendera ke duyang menghitung ukuran dalam byte dan sejauh yang saya dapat menentukan menghilangkan perbedaan pada dua server. Anda masih bisa menggunakan -s -huntuk mendapatkan output yang komprehensif.

booltype
sumber
0

letakkan di skrip init seperti .bashrc ... sesuaikan def sesuai kebutuhan.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}
Goran B.
sumber
-1

ketik "ls -ltrh / path_to_directory"

pengguna6051290
sumber