【问题标题】:How do I get remaining space for current use in a shell script?如何在 shell 脚本中获取当前使用的剩余空间?
【发布时间】:2013-04-17 16:45:17
【问题描述】:

好的,所以我正在编写一个 shell 脚本,如果可用空间不足,则需要删除文件,但是我不知道如何以考虑配额的方式检索剩余空间(如果设置)。

例如,我可以使用 df 命令,但这似乎只检索文件系统的实际块使用情况,因此它会报告整个卷的总可用空间,即使用户的配额会阻止脚本不要使用那么多空间。

是否有我可以使用的命令来检索当前用户配额或卷的可用空间(以较低者为准)剩余的最小可用空间?

[编辑] 好的,看起来配额命令可以让我获得我需要的信息,我现在遇到的问题是从中获取所有可能的返回值的有用数据。在没有设置配额的情况下调用它只会返回“none”,这意味着我需要深入研究 df 来获取大小。

任何人都可以帮助查询配额然后 df(如果需要)以获取当前使用情况和最大块大小(通过配额或体积,以最低/设置为准),以便我可以计算数量剩余空间?

【问题讨论】:

标签: unix ssh


【解决方案1】:

你可以使用下面的命令来查找文件系统的占用情况,试一下看看。

df -k /*somedirectoryname

希望这会有所帮助。

【讨论】:

  • 我想这就是我以前尝试过的;它不会报告考虑到我的配额的剩余空间,只是返回整个卷的剩余空间。因此,如果有 500gb 的可用空间,那么它就会返回,即使我只有 10gb 的剩余配额。
【解决方案2】:

这是我最后想出的脚本;它应该相当可靠地返回文件系统的剩余空间(以字节为单位)或同一文件系统的用户剩余配额。查找与 quota 一起使用的正确 /dev/foo 路径并不像我想的那么快。

#!/bin/sh
freespace_remaining() {
    # Get remaining space on file-system
    fs=$(df -k "$1" | tail -1)
    free=$(echo "$fs" | awk '{ print $4 }')
    let 'free *= 1024'

    # Determine the device for the file-system
    device=
    mnt=$(echo "$fs" | awk '{ print $6 }')
    if [ "$cached_mnt" != "$mnt" ] 
        then
            cached_mnt="$mnt"

            mnts=$(mount)
            newmnt="$mnt"

            # Try to get a root mount point (for encrypted folders etc.)
            while [ -n "$newmnt" ] 
            do
                newmnt=$(echo "$mnts" | grep " on $mnt " | awk '{ print $1 }')
                [ "$newmnt" = "$mnt" ] && break

                if [ -n "$newmnt" ] 
                    then
                        device="$newmnt"
                        mnt=$(df "$newmnt" 2> /dev/null | tail -1 | awk '{print $6 }')

                        [ "$mnt" = "$device" -o "$mnt" = "$last" ] && break
                        last="$mnt"
                fi
            done

            cached_device="$device"
    fi

    # Lookup the user's quota for the target device (if any is set)
    quota=$(quota | grep "[\s]*$device")

    # Return the lower of the two values as remaining space
    if [ -n "$quota" ]
        then
            quota=$(echo "$quota" | awk '{ print $3 }')
            used=$(echo "$quota" | awk '{ print $2 }')

            let 'quota=(quota - used) * 1024'
            [ "$quota" -lt "$free" ] && free="$quota"
    fi
    echo "$free"
}

freespace_remaining "$1"

希望它是如何工作的足够清楚,只需传入一个路径作为第一个(也是唯一一个)参数,它会返回剩余的可用空间,同时考虑到当前用户的配额(如果有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2012-08-02
    • 2011-04-16
    • 1970-01-01
    • 2019-01-02
    • 2012-10-05
    相关资源
    最近更新 更多