【问题标题】:Get free disk space with df to just display free space in kb?使用 df 获取可用磁盘空间以仅以 kb 为单位显示可用空间?
【发布时间】:2013-11-11 06:54:35
【问题描述】:

我正在尝试输出文件系统 /example 上的可用磁盘空间量。

如果我运行命令df -k /example,我可以获得关于可用磁盘空间(以 kb 为单位)的良好信息,但只能通过人类实际查看。

我需要获取这些数据并在我的 shell 脚本中的其他地方使用它。我最初考虑使用cut,但随后我的脚本将无法移植到其他磁盘,因为可用磁盘空间会有所不同,并且 cut 不会产生准确的结果。

我怎样才能得到示例的可用磁盘空间(以 kb 为单位)的输出?

【问题讨论】:

    标签: linux bash unix cut linux-disk-free


    【解决方案1】:

    要让df 的输出以kb 为单位显示数据,您只需使用-k 标志:

    df -k
    

    此外,如果您为 df 指定一个文件系统,您将获得该特定文件系统的值,而不是全部:

    df -k /example
    

    关于您的问题的主体:您想要提取给定文件系统上的可用磁盘空间量。这将需要一些处理。

    给定一个正常的df -k 输出:

    $ df -k /tmp
    Filesystem     1K-blocks    Used Available Use% Mounted on
    /dev/sda1        7223800 4270396   2586456  63% /
    

    你可以得到Available(第4列),例如awkcut(以前用管道连接到trsqueeze-repeats-s)用于空格):

    $ df -k /tmp | tail -1 | awk '{print $4}'
    2586456
    $ df -k /tmp | tail -1 | tr -s ' ' | cut -d' ' -f4
    2586456
    

    与往常一样,如果要将结果存储在变量中,请使用 var=$(command) 语法,如下所示:

    $ myUsed=$(df -k /tmp | tail -1 | awk '{print $4}')
    $ echo "$myUsed"
    2586456
    

    另外,从comment by Tim Bunce 中,您可以使用--direct 来处理长文件系统名称以获取-,这样它就不会打印破坏引擎的行:

    $ df -k --direct /tmp
    Filesystem     1K-blocks    Used Available Use% Mounted on
    -                7223800 4270396   2586456  63% /
    

    【讨论】:

    • 谢谢!这正是我所需要的。感谢您抽出时间给我一个答案,而不是像其他人一样投反对票:( +1 给你!
    • 在这种情况下,您可以使用cut 而不是awk。无需使用坦克杀死苍蝇:)
    • @IdrissNeumann 是的,我同意,也许我太喜欢awk 了:D 更新为cut 版本,虽然它需要一个额外的管道来挤压空间。
    • 哦,您可以使用 -f 标志指定要剪切的 arg。我不知道,谢谢!
    • tail -1 then 计数字段不安全,因为如果文件系统名称很长,df 可能会在文件系统名称后换行(例如,对我来说 /dev/mapper/vg_1-lv_root)。一种解决方法是使用--direct 选项将文件干报告为-
    【解决方案2】:

    您可以使用 stat(2) 命令来显示空闲块并找出每个块的大小,例如

    stat -f --printf="%a %s\n" /
    

    将显示给定文件系统 (/) 上的空闲块数 (%a),后跟块大小 (%s)。要获取以 kB 为单位的大小,您可以使用 bc(1) 命令,如下例所示:

    stat -f --printf="%a * %s / 1024\n" / | bc
    

    最后,将其放入变量中只需使用反引号替换(或第一个答案中的 $()):

    SOMEVAR=`stat -f --printf="%a * %s / 1024\n" / | bc`
    

    【讨论】:

    • 不错!也可以在 bash 脚本中轻松使用,例如if [[ $( stat -f --printf="%a*%s" $PWD ) -lt "1*1024**3" ]]; then echo "Less than 1G free"; fi
    • 这适用于 RHEL5、RHEL6 以及我的 Ubuntu。干得好。
    • 请提出更改以返回以 MB 为单位的值。谢谢
    【解决方案3】:

    这是另一种解决方案:

    df --output=avail -m /example | tail -1
    

    输出:

    6415

    【讨论】:

    • 你的解决方案可以进一步修改为df --output=avail -m /example | tail -1 | tr -d ' ',去掉输出前面的空格。
    • 这很好,因为它提供了一个纯数值。
    【解决方案4】:

    仅显示有趣的列

     df /example --total -k -h  --output=source,avail
    
    • --total = 最后的总计
    • -k = 块大小 1K
    • -h = 人类可读
    • --output=[FIELD_LIST] 列列表以“,”分隔显示

    不完全标准(我在 Ubuntu 手册页中看到过 --output),在这种情况下,不需要 Awk 和其他仅删除列的方法。

    【讨论】:

      【解决方案5】:

      我创建了一个小脚本,它将获取文件系统已用空间并将总已用空间大小转换为 GB。

      df -Th | grep -vE "tmpfs|nfs|boot|overlay|vfat|cifs"| awk '{print $4}'|sed 's/.$//'| grep -vw "^使用"|粘贴 -s -d+|bc

      【讨论】:

        猜你喜欢
        • 2016-09-06
        • 2019-12-12
        • 2010-11-26
        • 2013-12-05
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多