【问题标题】:Unix bash script for analyzing directory size用于分析目录大小的 Unix bash 脚本
【发布时间】:2018-12-10 01:44:53
【问题描述】:

我正在编写一个简单的 bash 脚本来确定目录大小。我知道这很简单,只需使用du -sh directory_name

我正在尝试学习如何使用 for 循环、while 循环和 if 语句来完成这项任务。这是我的代码:

    #while the directory size is less than 1
    while [ -d "$varDirectory" ] && $(du -sh $varDirectory) -lt "$minimumsize"
    do
        echo "$varDirectory is less than 1kb"
        exit
    done
    #for the directory, display the size in human readable format.
    for $varDirectory  
    do
        du -sh $varDirectory
    done

}

它基本上要做的是检查目录的用户输入是否存在,如果不存在则显示它不存在。然后使用while循环检查大小是否大于1,并显示大于1。最后,使用for循环显示文件大小。

我收到一个错误:意外标记 `}' 附近的语法错误

更新

输出

    Please enter a directory
    /home/kayenine
    ./directory.sh: line 15: 298M: command not found
    ./directory.sh: line 20: 298M: command not found
    ./directory.sh: line 4: `$varDirectory': not a valid identifier

【问题讨论】:

  • 你应该把它放在shellcheck.net,但你遇到的具体错误可能是因为最后一个for循环没有done
  • 您还应该对if [ ! -r "$varDirectory" ] 进行第二次检查,因为无论您是否有权从该目录读取,该目录都会测试为真。确定它是否可读的第二次检查是谨慎的。
  • du -sh 不会输出像298 这样的简单值,它会输出298M <dir name>,因此您需要获取du 以输出计划旧千字节。所以请改用du -k $varDirectory | cut -f1。因此,while 循环中条件的第二部分应该是[ $(du -sh "$varDirectory") -gt "$minimumsize" ]。注意[]'s。
  • 您致电du -sh $varDirectory 多少次(超过一次)?你为什么要多次使用while 而一个简单的if.. then .. else .. fi 就可以了?

标签: bash function shell unix directory


【解决方案1】:

这个说法是错误的:

while [ -d $varDirectory ] && du -s $varDirectory > $minimumsize

> 重定向输出。它不是大于运算符-gt。这会导致您的无限循环。

这也是错误的:

    s=echo "$varDirectory is greater then 1kb"

您可能想要这样做:

    s="$varDirectory is greater then 1kb"

这也有各种各样的问题:

while [ -d $varDirectory ] && du -s $varDirectory < $minimumsize
    echo $l
    l=echo "$varDirectory is less than 1kb"

一方面没有dodone,所以这可能会导致您的语法错误。同样&lt; 是重定向,而不是小于运算符-lt

我希望您不要以 root 身份运行此脚本。

更新:你的更新也有问题。

while [ -d $varDirectory ] && du -sh $varDirectory -gt $minimumsize

应该是:

while [ -d "$varDirectory" ] && [ $(du -k $varDirectory | cut -f1) -gt "$minimumsize" ]

我根据 David 的建议添加了 ""

【讨论】:

  • 什么意思没有做?
  • 正确的方式是while […]; do你有while […]; echo $l
  • 好的,所以我已经根据你的 cmets 修改了代码,它似乎可以工作,除了输入目录后出现此错误 du: invalid option -- 'g' Try 'du --help ' 了解更多信息。
  • 我做了,它适用于 du -h 但不适用于 du -sh。但是当我检查其他 stackoverflow 答案时,我发现 du -sh 是一个合法参数。
  • 如果$varDirectory 包含空格,您的[ ... ] 将失败。 (总是在[...] 内引用或使用[[...]]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多