创建一个文件,其大小(以字节为单位)为磁盘上可用空间的百分比

创建一个文件,其大小(以字节为单位)为磁盘上可用空间的百分比

我需要一种命令行方法来创建一个文件,其大小(以字节为单位)是磁盘上可用空间的百分比。我打算每五分钟通过 cron 运行一次,但首先使用 shell 脚本就可以了。

目标平台是DOMAIN/OS中的BSD4.3环境,因此我有ksh、、awksed常用的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,分别通过十六进制节点 ID 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 系统一样令人印象深刻。本机操作系统试图通过提供具有合理 BSD 命令集的 BSD4.3“环境”来模仿 Unix,但有一种将 BSD 和宙斯盾命令(如lvolfs),就像我在这里所做的那样。

我有两个工作站,每个工作站都控制自动测试设备。这两个工作站联网在一起,网络根目录//包括 tr2(节点 ID 4D72C)和 tr3(节点 ID 52055)。你并不真的想要或需要知道所有这些事情- 我只是想让人们明白,任何事情都不应该被视为理所当然。我不希望任何人在这些事情上浪费太多时间——我的工作,但如果您有任何建议,我将不胜感激。Korn Shell 对我来说仍然有点神秘。

更新:df -aDOMAIN/OS 中的命令提供

$ 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%

因为它提到了更熟悉的名字tr2tr3,可能是更好的选择。唯一的轻微障碍是我们需要磁盘空间用过的不是自由的,但这可以克服。

答案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

请在使用前仔细检查以确保它能够达到您的预期。

相关内容