Проверьте свободное место на диске для текущего раздела в bash
Я пишу установщик в bash. Пользователь перейдет в целевой каталог и выполнит установку script, поэтому первое действие должно состоять в том, чтобы проверить, что достаточно места. Я знаю, что df сообщит обо всех файловых системах, но мне было интересно, есть ли способ получить свободное пространство только для раздела, на котором находится целевой каталог.
Изменить - ответ, который я придумал
df $PWD | awk '/[0-9]%/{print $(NF-2)}'
Немного странно, потому что df, кажется, форматирует свой вывод, чтобы он соответствовал терминалу, поэтому с длинным именем точки монтирования вывод сдвигается вниз по строке
Ответы
Ответ 1
Да:
df -k .
для текущего каталога.
df -k /some/dir
если вы хотите проверить конкретный каталог.
Вы также можете проверить команду stat(1)
, если ваша система имеет ее. Вы можете указать выходные форматы, чтобы упростить анализ script. Вот небольшой пример:
$ echo $(($(stat -f --format="%a*%S" .)))
Ответ 2
-
df
команда: использование дискового пространства в файловой системе отчета
-
du
команда: оценка использования файлового пространства
Введите df -h
или df -k
, чтобы отобразить свободное место на диске:
$ df -h
ИЛИ
$ df -k
du
показывает, сколько пространства используется для большего количества файлов или каталогов.
$ du -sh
-s
укажите суммарное пространство, которое использует каталог, и -h
предоставляет отчет для человека.
Ответ 3
Я думаю, что это должен быть комментарий или редактирование ответа ThinkingMedia по этому самому вопросу (Проверить свободное место на диске для текущего раздела в bash), но я мне не разрешено прокомментировать (недостаточно rep), и мое редактирование было отклонено (причина: "это должен быть комментарий или ответ" ).
Так что, пожалуйста, силы Вселенной SO, не проклинайте меня за повторение и исправление кого-то другого "отвечают". Но кто-то в интернете ошибался! ™, и они не позволили мне это исправить.
Код
df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'
имеет существенный недостаток:
Да, он выведет 50G
бесплатно как 50 - но он также выведет 5.0M
бесплатно как 50 или 3.4G
бесплатно, как 34 или 15K
бесплатно, как 15.
Чтобы создать script с целью проверки определенного объема свободного места на диске, вам нужно знать, с какой единицей вы проверяете. Удалите его (как sed
делает в примере выше) номера больше не имеют смысла.
Если вы действительно хотите, чтобы он работал, вам нужно будет сделать что-то вроде:
FREE=`df -k --output=avail "$PWD" | tail -n1` # df -k not df -h
if [[ $FREE -lt 10485760 ]]; then # 10G = 10*1024*1024k
# less than 10GBs free!
fi;
Также для установщика df -k $INSTALL_TARGET_DIRECTORY
может быть больше смысла, чем df -k "$PWD"
.
Наконец, обратите внимание, что флаг --output
недоступен в каждой версии df/linux.
Ответ 4
Чтобы узнать об использовании конкретного каталога в GB или TB в linux, команда:
df -h/dir/internal_dir/
or
df -sh/dir/inner_dir/
и знать использование конкретного каталога в битах в Linux, команда
df-k/dir/inner_dir/
Ответ 5
Полный пример для тех, кто может захотеть использовать это для мониторинга точки монтирования на сервере. В этом примере будет проверяться, находится ли /var/spool под 5G и отправляется по электронной почте человеку:
#!/bin/bash
# -----------------------------------------------------------------------------------------
# SUMMARY: Check if MOUNT is under certain quota, mail us if this is the case
# DETAILS: If under 5G we have it alert us via email. blah blah
# -----------------------------------------------------------------------------------------
# CRON: 0 0,4,8,12,16 * * * /var/www/httpd-config/server_scripts/clear_root_spool_log.bash
MOUNTP=/var/spool # mount drive to check
LIMITSIZE=5485760 # 5G = 10*1024*1024k # limit size in GB (FLOOR QUOTA)
FREE=$(df -k --output=avail "$MOUNTP" | tail -n1) # df -k not df -h
LOG=/tmp/log-$(basename ${0}).log
MAILCMD=mail
EMAILIDS="[email protected]"
MAILMESSAGE=/tmp/tmp-$(basename ${0})
# -----------------------------------------------------------------------------------------
function email_on_failure(){
sMess="$1"
echo "" >$MAILMESSAGE
echo "Hostname: $(hostname)" >>$MAILMESSAGE
echo "Date & Time: $(date)" >>$MAILMESSAGE
# Email letter formation here:
echo -e "\n[ $(date +%Y%m%d_%H%M%S%Z) ] Current Status:\n\n" >>$MAILMESSAGE
cat $sMess >>$MAILMESSAGE
echo "" >>$MAILMESSAGE
echo "*** This email generated by $(basename $0) shell script ***" >>$MAILMESSAGE
echo "*** Please don't reply this email, this is just notification email ***" >>$MAILMESSAGE
# sending email (need to have an email client set up or sendmail)
$MAILCMD -s "Urgent MAIL Alert For $(hostname) AWS Server" "$EMAILIDS" < $MAILMESSAGE
[[ -f $MAILMESSAGE ]] && rm -f $MAILMESSAGE
}
# -----------------------------------------------------------------------------------------
if [[ $FREE -lt $LIMITSIZE ]]; then
echo "Writing to $LOG"
echo "MAIL ERROR: Less than $((($FREE/1000))) MB free (QUOTA) on $MOUNTP!" | tee ${LOG}
echo -e "\nPotential Files To Delete:" | tee -a ${LOG}
find $MOUNTP -xdev -type f -size +500M -exec du -sh {} ';' | sort -rh | head -n20 | tee -a ${LOG}
email_on_failure ${LOG}
else
echo "Currently $(((($FREE-$LIMITSIZE)/1000))) MB of QUOTA available of on $MOUNTP. "
fi
Ответ 6
df --output=avail -B 1 "$PWD" |tail -n 1
вы получаете размер в байтах таким образом.
Ответ 7
Чтобы получить текущее свободное место на диске в удобном для чтения формате с буквами. Следующее выведет свободное пространство для текущего раздела, отбросит заголовок и разделит буквы.
df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'
Вывод 50G
свободный как 50
.
Сделать эту часть условия свободного дискового пространства в bash script.
FREE=`df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'`
if [[ $FREE -lt 10 ]]; then
# less than 10GBs free!
fi;