【问题标题】:Check folder size in Bash检查 Bash 中的文件夹大小
【发布时间】:2013-05-15 17:55:16
【问题描述】:

我正在尝试编写一个脚本来计算目录大小,如果大小小于 10GB,大于 2GB,则执行一些操作。我需要在哪里提及我的文件夹名称?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

【问题讨论】:

  • 如果你想对其进行排序:serverfault.com/questions/62411/…
  • 因为这是一个热门问题 - 如果有初学者遇到此问题的答案并想了解更多关于 du 到底是什么以及每个人如何知道所有这些命令的信息:您可以输入 @ 987654326@ 在您的终端中查找手册中的 du 命令。这将显示一个您可以查看的输出,并将总结您建议使用的答案的所有标志,例如 -h、-c、-s、-b、-B、--apparent-size 等。然后,您可以自行决定如何将du 用于您的特定用例。

标签: bash shell directory


【解决方案1】:

你可以这样做:

du -hs your_directory

这将为您提供目标目录大小的简要输出。使用像* 这样的通配符可以选择多个目录。

如果您想要目标中所有文件和子目录的完整大小列表,您可以这样做:

du -h your_directory

提示:

  • 添加参数 -c 以在末尾查看 Total 行。示例:du -hcsdu -hc

  • 删除参数 -h 以查看精确 KiB 的大小,而不是人类可读的 MiB 或 GiB 格式。示例:du -sdu -cs

【讨论】:

  • 当您尝试获取脚本的值时,您不需要人类可读的数字。
  • 如果没有指定目录路径,它将默认为当前工作目录。所以du -hs == du -hs ..
  • 另请查看:du | sort -n 它将按目录大小对目录进行排序
  • du -hcs dir_name/* 包括子文件夹
  • du -h |尾 -1 ?
【解决方案2】:

如果您只想查看文件夹大小而不是子文件夹,您可以使用:

du -hs /path/to/directory

更新:

你应该知道du显示的是已用磁盘空间;而不是文件大小。

如果您想查看实际文件大小的总和,可以使用--apparent-size

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

当然,脚本中不需要-h(人类可读)选项。

相反,您可以使用-b 以便在脚本内部进行比较。

但是您应该注意-b 本身适用--apparent-size。它可能不是你需要的。

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

所以我认为,您应该使用--block-size-B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

【讨论】:

  • 我知道这已经有几年了,但您能解释一下条件句中 regex 和 BASH_REMATCH 的目的是什么吗? (或提供一些关于这些变量/命令/格式的使用的链接)我希望代码只是在变量中获取文件的大小并直接与 10 gb 进行比较,其他的东西在做什么?
  • @Nordico 是的。不需要正则表达式和 BASH_REMATCH 所以我更新了答案。
【解决方案3】:

使用摘要 (-s) 和字节 (-b)。您可以使用cut 剪切摘要的第一个字段。把它们放在一起:

CHECK=$(du -sb /data/sflow_log | cut -f1)

【讨论】:

  • 我是 shell 脚本的新手。 du 命令的输出包括目录名称。我无法仅获得数字部分。答案中的“cut”解开了谜团!
【解决方案4】:

仅获取目录的大小,仅此而已:

du --max-depth=0 ./directory

输出看起来像

5234232       ./directory

【讨论】:

  • --max-depth 对于有效地控制输出非常有用!例如,要很好地了解目录中发生的事情:du -h --max-depth=1
【解决方案5】:

要检查目录中所有目录的大小,可以使用:

du -h --max-depth=1

【讨论】:

  • du -h -d 1 在安卓上。
  • du -h -d 1 在 OSX 上
【解决方案6】:

如果您只想查看文件夹的总大小,可能是 MB 或 GB 格式,请尝试以下脚本

$du -s --block-size=M /path/to/your/directory/

【讨论】:

  • 在 os x 上,标志是 -g 用于 1-Gbyte 和 -m 用于 1-Mbyte 计数。通过man du
【解决方案7】:
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

【讨论】:

  • 两个变量同名? (检查)
【解决方案8】:

如果有帮助,您还可以在 .bashrc.bash_profile 中创建别名。

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

这将打印当前目录的大小或作为参数传递的目录。

【讨论】:

  • 这是一个很好的答案
  • 您应该在将$dir 传递给du 时引用它,以防止对$dir 的值进行分词。将对du 的调用包装成echo $(…) 似乎是多余的。您可以使用内置的 Bash 变量 ${PWD},而不是调用 pwd。为了检查是否设置了变量,我建议[ -v varname ]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 2019-08-24
  • 1970-01-01
  • 2011-12-16
  • 2012-02-09
相关资源
最近更新 更多