【问题标题】:bash script: calculate sum size of filesbash脚本:计算文件的总大小
【发布时间】:2018-04-23 08:38:22
【问题描述】:

我在 Linux 上工作,需要计算目录中某些文件的总大小。

我编写了一个名为 cal.sh 的 bash 脚本,如下所示:

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo $line
done<`ls -l | grep opencv | awk '{print $5}'`

但是,当我执行此脚本./cal.sh 时,出现错误:

./cal.sh: line 6: `ls -l | grep opencv | awk  '{print $5}'`: ambiguous redirect

如果我使用sh cal.sh 执行它,它似乎可以工作,但我会在输出结束时收到一些奇怪的消息:

25
31
385758: File name too long

为什么sh cal.sh 似乎有效? File name too long来自哪里?

【问题讨论】:

    标签: linux bash shell awk ls


    【解决方案1】:

    或者,您可以这样做:

    du -cb *opencv* | awk 'END{print $1}'
    

    选项-b 将以字节为单位显示每个文件,-c 将打印总大小。

    【讨论】:

      【解决方案2】:

      最终,正如其他答案所指出的那样,解析ls 的输出并不是一个好主意,因为它可能因系统而异。但值得知道为什么脚本不起作用。

      不明确的重定向错误是因为您需要在 ls 命令周围加上引号,即:

      while IFS='' read -r line || [[ -n "$line" ]]; do
        echo $line
      done < "`ls -l | grep opencv | awk '{print $5}'`"
      

      但这仍然不能满足您的要求。 "ls 命令的输出。但是您不想读取文件,您想读取ls 的输出。为此,您可以使用“

      while IFS='' read -r line || [[ -n "$line" ]]; do
          echo $line
      done <<< "`ls -l | grep opencv | awk '{print $5}'`"
      

      这按预期工作,但有一些缺点。当使用“此处字符串”时,命令必须首先完整执行,然后将所述命令的输出存储在临时变量中。如果命令执行时间长或输出量大,这可能是个问题。

      恕我直言,逐行迭代命令输出的最佳和最标准方法如下:

      ls -l | grep opencv | awk '{print $5} '| while read -r line ; do
          echo "line: $line"
      done
      

      【讨论】:

        【解决方案3】:

        我建议不要使用该管道来获取所需文件的大小 - 通常,您应该避免解析 ls。相反,您可以使用*opencv* 获取文件并使用stat 打印大小:

        stat -c %s *opencv*
        

        格式说明符%s 以字节为单位打印每个文件的大小。

        您可以将其发送到awk 以获取总和:

        stat -c %s *opencv* | awk '{ sum += $0 } END { if (sum) print sum }'
        

        if 用于确保没有输入 => 没有输出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 2012-07-21
          • 1970-01-01
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多