Kiểm tra kích thước thư mục trong Bash


317

Tôi đang cố gắng viết một tập lệnh sẽ tính toán kích thước thư mục và nếu kích thước nhỏ hơn 10GB và lớn hơn thì 2GB sẽ thực hiện một số hành động. Tôi cần đề cập đến tên thư mục của tôi ở đâu?

# 10GB
SIZE="1074747474"

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

1
Và nếu bạn muốn sắp xếp nó: serverfault.com/questions/62411/ từ
cregox


Vì đây là một câu hỏi phổ biến - Nếu bất kỳ người mới bắt đầu nào gặp phải câu trả lời cho câu hỏi này và muốn tìm hiểu thêm về cái quái gì duvà làm thế nào mọi người biết tất cả các lệnh này: Bạn có thể nhập man duvào thiết bị đầu cuối của mình để tra cứu lệnh du trong hướng dẫn. Điều này sẽ hiển thị một đầu ra mà bạn có thể xem và sẽ tóm tắt tất cả các cờ như -h, -c, -s, -b, -B, --apparent-size, v.v. mà các câu trả lời mà bạn đề nghị bạn sử dụng. Sau đó, bạn có thể tự quyết định cách bạn muốn sử dụng tốt nhất ducho trường hợp sử dụng cụ thể của mình.
Josh Desmond

Câu trả lời:


609

Bạn có thể làm:

du -h your_directory

Nó sẽ cung cấp cho bạn kích thước của thư mục đích của bạn.

Nếu bạn muốn một đầu ra ngắn gọn, du -hcs your_directorylà tốt đẹp.


15
Bạn không muốn các số có thể đọc được khi bạn đang cố gắng lấy giá trị cho tập lệnh.
thóc

4
Không có đường dẫn thư mục được chỉ định, nó sẽ mặc định cho thư mục làm việc hiện tại. vậy du -hs== du -hs ..
razz

8
Ngoài ra hãy kiểm tra: du | sort -nnó sẽ sắp xếp các thư mục theo kích thước của nó
tối ưu hóa

3
du -hcs dir_name/*bao gồm các thư mục con
tối ưu hóa

du -h <dir> | đuôi -1?
Alexander Mills

143

nếu bạn chỉ muốn xem kích thước thư mục chứ không phải thư mục con, bạn có thể sử dụng:

du -hs /path/to/directory

Cập nhật:

Bạn nên biết rằng duhiển thị không gian đĩa được sử dụng; và không phải kích thước tập tin.

Bạn có thể sử dụng --apparent-sizenếu bạn muốn xem tổng kích thước tệp thực tế.

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

Và tất nhiên không cần -htùy chọn (Con người có thể đọc được) trong một tập lệnh.

Thay vào đó, bạn có thể sử dụng -bđể so sánh dễ dàng hơn trong tập lệnh.

Nhưng bạn nên lưu ý rằng -báp dụng --apparent-sizebởi chính nó. Và nó có thể không phải là những gì bạn cần.

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

vì vậy tôi nghĩ rằng, bạn nên sử dụng --block-sizehoặc-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

Tôi biết đó là một vài năm, nhưng bạn có tử tế khi giải thích một chút về mục đích của regex và BASH_REMATCH trong các điều kiện không? (hoặc để cung cấp một số liên kết về việc sử dụng các biến / lệnh / định dạng đó) Tôi đã dự kiến ​​mã sẽ chỉ lấy kích thước của tệp trong một biến và so sánh trực tiếp với 10 gb, những thứ khác đang làm gì?
Nordico

2
@Nordico yup. không cần regex và BASH_REMATCH nên tôi đã cập nhật câu trả lời.
Taxellool

29

Sử dụng một tóm tắt ( -s) và byte ( -b). Bạn có thể cắt trường đầu tiên của bản tóm tắt với cut. Để tất cả chúng cùng nhau:

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

1
Tôi mới sử dụng shell scripting. Đầu ra của lệnh du bao gồm tên thư mục. Tôi đã không thể chỉ có được một phần số. "Cắt" trong câu trả lời của bạn đã giải quyết được bí ẩn!
SimpleDev

26

Để chỉ lấy kích thước của thư mục, không có gì hơn:

du --max-depth=0 ./directory

đầu ra trông như

5234232       ./directory

5
--max-depthlà rất hữu ích để kiểm soát đầu ra hữu ích! ví dụ, để có được một khái niệm tốt về những gì đang diễn ra trong một thư mục:du -h --max-depth=1
matanster

15

Để kiểm tra kích thước của tất cả các thư mục trong một thư mục, bạn có thể sử dụng:

du -h --max-depth=1


5
hoặc du -h -d 1trên Android.
jiggunjer

5
du -h -d 1trên OSX
Mike W

12

nếu bạn chỉ muốn xem kích thước tổng hợp của thư mục và có thể ở định dạng MB hoặc GB, vui lòng thử tập lệnh bên dưới

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

1
trên os x, các cờ -gdành cho 1-Gbyte và-m cho số lượng 1-Mbyte. thông quaman 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

Nếu nó hữu ích, Bạn cũng có thể tạo bí danh trong .bashrchoặc.bash_profile .

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

Điều này in kích thước của thư mục hiện tại hoặc thư mục bạn đã vượt qua như một đối số.


Đây là một câu trả lời tuyệt vời
d8aninja 18/07/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.