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.


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)


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


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.


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


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

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


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.


Itu bagus. Izin dan ukuran dalam satu baris
Ben

7

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


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

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.


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

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

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


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

3

du -sm * | semacam -nr

Output berdasarkan ukuran



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"

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 .

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.


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.


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


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


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.


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"
}

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.