如何在 shell 脚本中以变量形式获取 $HOME 的可用空间?

如何在 shell 脚本中以变量形式获取 $HOME 的可用空间?

我正在编写一个bash script为不同用户安装程序的程序。

为此,我想确保每个用户至少500Mb在他们的目录中都有可用的 $HOME。我的$HOME目录如下所示

jen@ser23:~$ df -h
Filesystem                           Size  Used Avail Use% Mounted on
/dev/sda1                            2,9G  1,1G  1,7G  40% /
udev                                 10M     0   10M   0% /dev
tmpfs                                13G   826M   12G   7% /run
/dev/sda3                            15G   9,8G   4,1G   71% /usr
tmpfs                                32G     0   32G   0% /dev/shm
tmpfs                                5,0M    0   5,0M  0% /run/lock
tmpfs                                32G     0   32G   0% /sys/fs/cgroup
/dev/mapper/local_disk_1-tmp         3,7G   21M  3,7G   1% /tmp
/dev/mapper/local_disk_1-opt         20G   2,0G   18G   10% /opt
/dev/mapper/local_disk_1-project1    401G  287G  114G  72% /project1
/dev/mapper/local_disk_1-var         3,8G  1,7G  1,7G  50% /var
/dev/mapper/local_disk_1-project2    99G   70G   29G   71% /project2
/dev/mapper/local_disk_1-usr_local   2,0G  3,4M  1,9G   1% /usr/local
nfs4.sf0.ise.fhg.de:/g/6/TSB/Archiv  632T  349T  276T  56% /net/p/600/groupdrives/TSB/Archiv
nfs4.sf0.ise.fhg.de:/home            632T  349T  276T  56% /net/home
tmpfs                                6,4G     0  6,4G   0% /run/user/12419
tmpfs                                6,4G  4,0K  6,4G   1% /run/user/13471
tmpfs                                6,4G  4,0K  6,4G   1% /run/user/9351
tmpfs                                6,4G     0  6,4G   0% /run/user/13142

我的想法是使用df -h /path/to/home | awk,但我不确定如何从中获取实际可用空间df -h。有什么帮助吗?谢谢,Jen。

jen@ser23:~$ df -P /net/home/j/jen
Filesystem                1024-blocks    Used Available Capacity Mounted on
nfs4.sf0.dfd.fhg.de:/home     5242880 1026048   4216832      20% /net/home

答案1

要记住的重点是df要记住的文件系统,它可能附加到特定文件夹,如果您指定路径或文件,它将解析文件/文件夹所在的文件系统的使用情况。因此,它对df -P /net/home/j/jen安装在的文件系统进行操作/net/home,这显然是 nfs4.sf0.ise.fhg.de网络附加存储。

使用目录和所有文件需要递归解决方案,该解决方案将遍历特定目录中的文件和目录。那么您要寻找的工具是,du特别是du -shx /net/home/user

要点(更多内容请阅读曼杜):

  • du默认是递归的
  • -s提供摘要,而不是单独列出文件大小
  • -h提供人类可读的输出。如果您需要对数据进行进一步处理,-b可能更可取。
  • -x是继续du下降到另一个。例如,您可能有另一个网络服务器连接到/net/home/user/anotherplace,因此处理该目录是不可取的,因为它会给出不正确的文件系统使用结果。

考虑到这是一项作业,对输出的进一步处理和操作du留给读者去实现

答案2

不需要用 解析df输出awk,您可以使用--output开关:

df --output=avail "$HOME" | tail -n1

--输出[=FIELD_LIST]
使用 FIELD_LIST 定义的输出格式,如果省略 FIELD_LIST,则打印所有字段。

字段列表是要包含的列的逗号分隔列表。有效的字段名称为:“source”、“fstype”、“itotal”、“iused”、“iavail”、“ipcent”、“size”、“used”、“avail”、“pcent”、“file”和“target”

答案3

看起来你已经在评论中找到了可行的解决方案,但我将提出这一点:

DFHOME=$( df $HOME | awk {'print $4;'} | tail -n 1 )
if [ $DFHOME -lt 500000 ]; then 
  echo "You don't got enough space!";
fi

我建议不要使用 -h,因为如果尺寸足够小,G 将变成 M,并且您的解决方案可能会中断。

相关内容