Periksa ukuran folder di Bash


317

Saya mencoba menulis skrip yang akan menghitung ukuran direktori dan jika ukurannya kurang dari 10GB, dan lebih besar dari 2GB melakukan beberapa tindakan. Di mana saya perlu menyebutkan nama folder saya?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

1
Dan jika Anda ingin mengurutkannya: serverfault.com/questions/62411/…
cregox


Karena ini adalah pertanyaan yang populer - Jika ada pemula yang menemukan jawaban pada pertanyaan ini dan ingin mempelajari lebih lanjut tentang apa duitu dan bagaimana semua orang tahu semua perintah ini: Anda dapat mengetikkan man duterminal Anda untuk mencari perintah du dalam manual. Ini akan menampilkan output yang dapat Anda lihat, dan akan merangkum semua flag seperti -h, -c, -s, -b, -B, --apparent-size, dll. Bahwa jawaban yang Anda sarankan Anda gunakan. Kemudian, Anda dapat memutuskan sendiri bagaimana Anda ingin menggunakan duuntuk kasus penggunaan spesifik Anda.
Josh Desmond

Jawaban:


610

Anda dapat melakukan:

du -h your_directory

yang akan memberi Anda ukuran direktori target Anda.

Jika Anda ingin keluaran singkat, du -hcs your_directoryitu bagus.


15
Anda tidak ingin angka yang dapat dibaca manusia saat Anda mencoba mendapatkan nilai untuk skrip.
padi

4
Tanpa jalur direktori yang ditentukan itu akan default ke direktori kerja saat ini. jadi du -hs== du -hs ..
razz

8
Juga periksa: du | sort -nitu akan mengurutkan direktori berdasarkan ukurannya
optimis

3
du -hcs dir_name/*termasuk subfolder
optimis

du -h <dir> | ekor -1?
Alexander Mills

143

jika Anda hanya ingin melihat ukuran folder dan bukan sub-folder, Anda dapat menggunakan:

du -hs /path/to/directory

Memperbarui:

Anda harus tahu yang dumenunjukkan ruang disk yang digunakan; dan bukan ukuran file.

Anda dapat menggunakan --apparent-sizejika Anda ingin melihat jumlah ukuran file aktual.

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

Dan tentu saja tidak perlu untuk -hopsi (dapat dibaca manusia) di dalam skrip.

Sebagai gantinya Anda dapat menggunakan -buntuk perbandingan yang lebih mudah di dalam skrip.

Tetapi Anda harus Catatan yang -bberlaku --apparent-sizedengan sendirinya. Dan itu mungkin bukan yang Anda butuhkan.

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

jadi saya pikir, Anda harus menggunakan --block-sizeatau-B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

Saya tahu ini sudah beberapa tahun, tetapi apakah Anda akan berbaik hati menjelaskan sedikit apa tujuan dari regex dan BASH_REMATCH dalam persyaratan? (atau untuk menyediakan beberapa tautan untuk penggunaan variabel / perintah / format tersebut) Saya akan mengharapkan kode untuk hanya mendapatkan ukuran file dalam variabel dan membandingkannya dengan 10 gb secara langsung, apa yang dilakukan hal-hal lain?
Nordico

2
@Nordico yup. tidak perlu untuk regex dan BASH_REMATCH jadi saya memperbarui jawabannya.
Taxellool

29

Gunakan ringkasan ( -s) dan byte ( -b). Anda dapat memotong bidang pertama ringkasan dengan cut. Menyatukan semuanya:

CHECK=$(du -sb /data/sflow_log | cut -f1)

1
Saya baru mengenal shell scripting. Output dari du command termasuk nama direktori. Saya tidak dapat hanya mendapatkan bagian nomor. "potong" dalam jawaban Anda memecahkan misteri!
simpleDev

26

Untuk hanya mendapatkan ukuran direktori, tidak lebih:

du --max-depth=0 ./directory

Outputnya seperti

5234232       ./directory

5
--max-depthsangat berguna untuk mengontrol keluaran! misalnya, untuk mendapatkan gagasan yang baik tentang apa yang terjadi di dalam direktori:du -h --max-depth=1
matanster


12

jika Anda hanya ingin melihat ukuran agregat folder dan mungkin dalam format MB atau GB, silakan coba skrip di bawah ini

$du -s --block-size=M /path/to/your/directory/

1
pada os x, bendera -guntuk 1-Gbyte dan -muntuk 1-Mbyte. viaman du
Sgnl

5
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

4

Jika ini membantu, Anda juga dapat membuat alias di .bashrcatau .bash_profile.

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

Ini mencetak ukuran direktori saat ini atau direktori yang Anda berikan sebagai argumen.


Ini adalah jawaban yang bagus
d8aninja
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.