Перевірте розмір папки в 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для конкретного випадку використання.
Джош Десмонд

Відповіді:


609

Ви можете зробити:

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

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

2
@Nordico yup. не було потреби в регулярному вираженні та 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


12

якщо ви просто хочете побачити сукупний розмір папки і, ймовірно, у форматі MB або GB, будь ласка, спробуйте наведений нижче сценарій

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

1
на os x прапори призначені -gдля 1-Гбайт і -mдля 1-Мбайт. 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

Якщо це допомагає, Ви також можете створити псевдонім у своєму .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.