Проверьте размер папки в Bash


317

Я пытаюсь написать сценарий, который будет рассчитывать размер каталога, и если размер меньше 10 ГБ и больше 2 ГБ, выполните какое-то действие. Где мне нужно указать имя моей папки?

# 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


Поскольку это популярный вопрос - если любой новичок сталкивается с ответами на этот вопрос и хочет узнать больше о том, что, черт возьми du, и как все знают все эти команды: Вы можете ввести man duсвой терминал, чтобы найти команду du в руководстве. Это отобразит вывод, который вы можете просмотреть, и суммирует все флаги, такие как -h, -c, -s, -b, -B, --apparent-size и т. Д., Ответы на которые вы предлагаете использовать. Затем вы можете решить для себя, как лучше всего использовать его duдля конкретного случая использования.
Джош Десмонд

Ответы:


610

Ты можешь сделать:

du -h your_directory

который даст вам размер вашей целевой директории.

Если вы хотите краткий вывод, du -hcs your_directoryэто хорошо.


15
Вам не нужны удобочитаемые числа, когда вы пытаетесь получить значение для скрипта.
Пэдди

4
Без указания пути к каталогу по умолчанию будет использоваться текущий рабочий каталог. так du -hs== du -hs ..
Разз

8
Также проверьте: du | sort -nон будет сортировать каталоги по размеру
optimiertes

3
du -hcs dir_name/*включает в себя подпапки
optimiertes

du -h <dir> | хвост -1?
Александр Миллс

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

Я знаю, что это было пару лет, но не могли бы вы немного объяснить, каково назначение регулярных выражений и BASH_REMATCH в условных выражениях? (или предоставить некоторые ссылки на использование этих переменных / команд / форматов) Я бы ожидал, что код просто получит размер файла в переменной и сравнит это с 10 ГБ напрямую, что эти другие вещи делают?
Nordico

2
@ Нордико не было необходимости в регулярных выражениях и 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
четкое


12

если вы просто хотите увидеть совокупный размер папки и, возможно, в формате МБ или ГБ, попробуйте следующий скрипт

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

1
на ос х флаги -gдля 1-мегабайта и -mдля 1-мегабайта. через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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.