ตรวจสอบขนาดโฟลเดอร์ใน Bash


317

ฉันพยายามเขียนสคริปต์ที่จะคำนวณขนาดไดเรกทอรีและถ้าขนาดน้อยกว่า 10GB และยิ่งใหญ่กว่านั้น 2GB ดำเนินการบางอย่าง ฉันต้องพูดถึงชื่อโฟลเดอร์ของฉันที่ไหน

# 10GB
SIZE="1074747474"

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

1
และถ้าคุณต้องการจัดเรียงมัน: serverfault.com/questions/62411/…
cregox

คำถามที่เกี่ยวข้อง: stackoverflow.com/q/1241801/5447906 , unix.stackexchange.com/q/185764/152606
anton_rh

เนื่องจากนี่เป็นคำถามยอดนิยม - หากผู้เริ่มต้นประสบคำตอบสำหรับคำถามนี้และต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสิ่งที่ heck duคือและวิธีที่ทุกคนรู้คำสั่งทั้งหมด: คุณสามารถพิมพ์man duในเทอร์มินัลของคุณเพื่อค้นหาคำสั่ง du ในคู่มือ สิ่งนี้จะแสดงเอาต์พุตที่คุณสามารถดูและจะสรุปแฟล็กทั้งหมดเช่น -h, -c, -s, -b, -B, --apparent-size ฯลฯ ที่คำตอบคือสิ่งที่คุณแนะนำให้คุณใช้ จากนั้นคุณสามารถตัดสินใจด้วยตัวเองว่าคุณต้องการduใช้กรณีการใช้งานเฉพาะของคุณอย่างไร
Josh Desmond

คำตอบ:


609

คุณทำได้:

du -h your_directory

ซึ่งจะให้ขนาดของไดเรกทอรีเป้าหมายของคุณ

ถ้าคุณต้องการเอาต์พุตแบบย่อdu -hcs your_directoryก็ดี


15
คุณไม่ต้องการตัวเลขที่มนุษย์อ่านได้เมื่อคุณพยายามที่จะรับค่าสคริปต์
ข้าวเปลือก

4
หากไม่มีการระบุเส้นทางไดเรกทอรีจะเริ่มต้นเป็นไดเรกทอรีการทำงานปัจจุบัน เพื่อให้==du -hs du -hs .
razz

8
ตรวจสอบด้วยเช่นกัน: du | sort -nมันจะเรียงลำดับไดเรกทอรีตามขนาดของมัน
optimiertes

3
du -hcs dir_name/*รวมโฟลเดอร์ย่อย
optimiertes

du -h <dir> | หาง -1
Alexander Mills

143

หากคุณต้องการเห็นขนาดโฟลเดอร์ไม่ใช่โฟลเดอร์ย่อยคุณสามารถใช้:

du -hs /path/to/directory

ปรับปรุง:

คุณควรรู้สิ่งนั้น duจะแสดงพื้นที่ดิสก์ที่ใช้ และไม่ใช่ขนาดไฟล์

คุณสามารถใช้--apparent-sizeถ้าคุณต้องการดูผลรวมของขนาดไฟล์จริง

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

และแน่นอนว่าไม่จำเป็นต้องมี-hตัวเลือก (มนุษย์อ่านได้) ภายในสคริปต์

คุณสามารถใช้-bเพื่อเปรียบเทียบสคริปต์ภายในได้ง่ายขึ้น

แต่คุณควรทราบว่ามี-bผลบังคับใช้--apparent-sizeด้วยตัวเอง และอาจไม่ใช่สิ่งที่คุณต้องการ

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

ดังนั้นฉันคิดว่าคุณควรใช้--block-sizeหรือ-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

ฉันรู้ว่าสองสามปีที่ผ่านมา แต่คุณจะกรุณาอธิบายเล็กน้อยว่าอะไรคือจุดประสงค์ของ regex และ BASH_REMATCH ในเงื่อนไข? (หรือเพื่อให้ลิงก์บางส่วนเกี่ยวกับการใช้งานตัวแปร / คำสั่ง / รูปแบบเหล่านั้น) ฉันคาดว่าโค้ดจะได้ขนาดของไฟล์ในตัวแปรและเปรียบเทียบกับ 10 gb โดยตรงสิ่งอื่น ๆ เหล่านี้ทำอะไรอยู่
Nordico

2
@Nordico yup ไม่จำเป็นต้องใช้ regex และ BASH_REMATCH ดังนั้นฉันจึงอัปเดตคำตอบ
Taxellool

29

ใช้ข้อมูลสรุป ( -s) และไบต์ ( -b) cutคุณสามารถตัดช่องแรกของการสรุปด้วย วางมันทั้งหมดเข้าด้วยกัน:

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

1
ฉันยังใหม่กับการเขียนสคริปต์เชลล์ เอาต์พุตของคำสั่ง du รวมชื่อไดเร็กทอรี ฉันไม่สามารถรับเฉพาะหมายเลขเท่านั้น "ตัด" ในคำตอบของคุณไขปริศนาได้!
simpleDev

26

เพื่อให้ได้ขนาดของไดเรกทอรีไม่มีอะไรเพิ่มเติม:

du --max-depth=0 ./directory

ผลลัพธ์ดูเหมือนว่า

5234232       ./directory

5
--max-depthมีประโยชน์มากสำหรับการควบคุมเอาต์พุตอย่างเป็นประโยชน์! ตัวอย่างเช่นเพื่อให้ได้แนวคิดที่ดีเกี่ยวกับสิ่งที่เกิดขึ้นในไดเรกทอรี:du -h --max-depth=1
matanster

15

ในการตรวจสอบขนาดของไดเรกทอรีทั้งหมดภายในไดเรกทอรีคุณสามารถใช้:

du -h --max-depth=1


5
หรือdu -h -d 1บน Android
jiggunjer

5
และdu -h -d 1ใน OSX
Mike W

12

หากคุณต้องการดูขนาดรวมของโฟลเดอร์และอาจอยู่ในรูปแบบ MB หรือ GB โปรดลองสคริปต์ด้านล่าง

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

1
บน os x แฟล็กใช้-gสำหรับ 1-Gbyte และ-mสำหรับ 1-Mbyte ผ่านman 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

ถ้ามันจะช่วยให้คุณสามารถสร้างนามแฝงในของคุณหรือ.bashrc.bash_profile

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

สิ่งนี้จะพิมพ์ขนาดของไดเรกทอรีปัจจุบันหรือไดเรกทอรีที่คุณส่งเป็นอาร์กิวเมนต์


นี่เป็นคำตอบที่ดี
d8aninja
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.