Создайте файл, размер которого в байтах является процентом свободного пространства на диске

Мне был нужен метод командной строки создания файла, размер которого в байтах является процентом свободного пространства на диске. Я намереваюсь выполнить его через крон каждые пять минут, но сначала сценарий оболочки сделает.

Целевая платформа является средой BSD4.3 в ДОМЕНЕ/ОС, таким образом, я имею ksh, awk, sed и обычные команды BSD, но не версии GNU.

Я могу выполнить команду lvolfs -a (не команда BSD), который перечисляет свободное пространство объема в этом формате:

  # free   # total   % free         node id  entry directory
  732532   1295672       57           4D72C   /
 3787184   4165732       91           52055   //tr3
-------------------------------
 4519716   5461404    82.76%      2 volumes.

таким образом, это кажется простым для извлечения значений, в этом случае 57 и 91, определяя их шестнадцатеричными идентификаторами узла, 4D72C и 52055, соответственно.

Я сразу думал 'dd, может сделать это', таким образом концентрируясь на узле 4D72C сначала, я придумал:

/com/lvolfs -a | \
    awk -e '/4D72C/ { print $3 }' | \
    sed -e 's|^|dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=|' | \
    sed -e 's|$| count=1|' >//tr2/archive/dirlist

. //tr2/archive/dirlist

И dirlist похож

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=57 count=1

Это работает, и я должен буду повторить что-то вроде этого для узла 52055, но интересно если dd единственный способ использовать действительно основные команды BSD. У кого-либо были бы какие-либо предложения?


Править: Еще некоторая справочная информация о целевой системе..., это - HP/Apollo DN433 'Техническая Рабочая станция', колени пчелы, когда она была выпущена в начале 80-х, но теперь почти столь же впечатляющая как 486DX система. Собственная ОС пытается подражать Unix путем обеспечения 'среды' BSD4.3 разумным набором команд BSD, но существует искушение смешать BSD и команды Aegis (как lvolfs) поскольку я сделал здесь.

У меня есть две рабочих станции и каждое Оборудование автоматического тестирования средств управления. Эти две рабочих станции объединяются в сеть вместе и сетевой корневой каталог // включает tr2 (идентификатор 4D72C узла) и tr3 (идентификатор 52055 узла). Вы действительно не хотите или должны знать весь этот материал - я был бы точно так же, как для произведения впечатления, что ничто не должно считаться само собой разумеющимся. Я не хочу, чтобы любой потратил впустую слишком много времени на этот материал - это - мое задание, но я ценил бы любые предложения, которые Вы могли бы иметь. Shell Korn является все еще определенной тайной мне.

ОБНОВЛЕНИЕ: df -a команда в ДОМЕНЕ/ОС дает

$ df -a
Filesystem         kbytes    used   avail capacity  Mounted on
/dev/wn96a        1295672  563904  731768    44%    //tr2
/dev/wn96a        4165732  379804 3785928     9%    //tr3
                ----------------------------------
                  5461300  943700 4517600    17%

Который, так как это упоминает более знакомые имена tr2 и tr3, мог бы быть предпочтительным. Единственное небольшое препятствие - то, что мы получаем дисковое пространство, используемое не свободный, но это может быть преодолено.

4
задан 01.02.2010, 00:31

1 ответ

Я использовал бы dd. Вы говорите "lvolfs-a (не команда BSD)". Вы имеете df? Это было бы более стандартным и портативным способом получить информацию использования объема.

Не должно быть необходимо создать временный файл сценария, чтобы сделать это. Необходимо смочь сделать:

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=\
$(/com/lvolfs -a | awk -e '/4D72C/ { print $3 }') count=1

или

avail=$(df /usr | awk -e 'NR==2 { print $5 }')
avail=${avail%*%}    # strip off the percent sign
dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=$avail count=1

(в зависимости от того, как Ваши файловые системы организованы и что вывод df похож).

Вы могли даже поместить второй в цикл:

for fs in / /usr /home    # list the ones you want to include
do
    avail=$(df $fs | awk -e 'NR==2 { print $5 }')
    avail=${avail%*%}     # strip off the percent sign
    # create a file on the particular filesystem/mount point
    dd if=/dev/rdsk of=//$fs/test/data/tr2.free bs=$avail count=1
done

Исследуйте это тщательно перед использованием его, чтобы удостовериться, что это делает то, что Вы предназначаете.

1
ответ дан 07.12.2019, 21:47

Теги

Похожие вопросы