Получить свободное место в текущем каталоге в Bash

25

Я знаю df -hи pwd, но это кажется немного сложным для части соответствия регулярному выражению. Любые идеи?

Cheng
источник
1
Вы имели в виду du -h?
Jweyrich

Ответы:

45

Анализ может быть немного упрощен при использовании -Pопции, которая гарантирует, что:

  1. Информация о каждой файловой системе всегда печатается ровно в одну строку; устройство монтирования никогда не ставится на линию само по себе. Это означает, что если имя устройства монтирования имеет длину более 20 символов (например, для некоторых сетевых монтирований), столбцы будут выровнены неправильно.

Это значительно упрощает получение только свободного места:

$ df -Ph . | tail -1 | awk '{print $4}'

( -hиспользует мегабайты, гигабайты и т. д. Если в вашей системе их нет, используйте -kтолько для килобайтов.)

Если мы передадим dfпуть, он вернет только 2 строки: строку заголовка и затем данные о файловой системе, которая содержит путь. Мы можем использовать хвост, чтобы захватить только второй ряд. Мы знаем, что доступное пространство находится в 4-м столбце, поэтому мы берем его с помощью awk. Это все можно сделать с помощью awk:

$ df -Ph . | awk 'NR==2 {print $4}'

или много других наборов фильтров .

Стивен Д
источник
Вы можете оптимизировать свою команду, используя переменную среды $PWDвместо использования подстановки команд и устраняя необходимость в хвосте: df -Ph $PWD | awk 'NR==2{print $4}'
SiegeX
@ SiegeX: Я согласен, что все awkбудет лучше. Я включил более длинную команду, потому что хотел получить пример того, как можно составить цепочку простых команд, чтобы сделать что-то более сложное. Я обновил ответ, чтобы включить ваше улучшение.
Стивен Д
-Pстандартный ( Pдля POSIX). Но -hэто расширение GNU (также существует в некоторых других системах, но, например, в OpenBSD оно несовместимо -P).
Жиль "ТАК - перестань быть злым"
Вы можете сделать это без использования переключателя --output = df -h --output=avail . | tail -1
Floyd
«Вы можете оптимизировать свою команду». На самом деле, нет. Выполнение обоих каналов 10'000 раз (как в time { I=0; while [ $I -lt 10000 ]; do df -Ph . | awk 'NR==2 {print $4}' > /dev/null; ((I++)); done }) не обнаруживает значимой разницы в скорости, что не удивительно - вызов tailне дорогой и awkбудет сэкономлен, чтобы пропустить до конца ввода ... Возможно, была разница PDP-11 ...
Дэвид Тонхофер
10

Как насчет того, чтобы делать df -h .. Это даст вам доступное свободное пространство раздела, в котором находится ваш текущий рабочий каталог.

Небольшой пример:

 /usr/local/nagios/libexec # df -h .
 Filesystem            Size  Used Avail Use% Mounted on
 /dev/mapper/vg00-lvol1
                       9.9G  6.1G  3.4G  65% /
Кристиан
источник
4

В байтах:

df --output=avail -B 1 "$PWD" | tail -n 1

Человек читаемый:

df --output=avail -h "$PWD" | tail -n 1

или

df --output=avail -B 1 "$PWD" |tail -n 1 | numfmt --to="iec"

или

df --output=avail -B 1 "$PWD" |tail -n 1 | numfmt --grouping
xerostomus
источник