【问题标题】:How to find the size of a file and assign it to a variable in Unix如何查找文件的大小并将其分配给 Unix 中的变量
【发布时间】:2014-08-23 16:45:27
【问题描述】:

我正在编写一个读取文本文件大小的 Unix 脚本,如果文件有一定大小,它应该打印文本文件。如果不是else,则执行循环并继续处理。

我正在使用以下命令来查找该文本文件的大小。

ls -l ${filepath}/{filename}.lst | awk '{print $5}'

如何将其分配给脚本内的变量并将其置于 if 条件中?或者,例如,if 条件 if[$var==461] 是否有效?

或者我可以使用其他命令来查找文件的大小?

【问题讨论】:

    标签: shell unix awk scripting


    【解决方案1】:

    我不推荐stat,因为它是不可移植的,不是由 POSIX 指定的。

    这是在变量中获取文件大小的更安全方法。

    size=$(ls -dnL -- "${filepath}/{filename}.lst" | awk '{print $5;exit}')
    

    【讨论】:

    • 呃。如果 stat(1) 不可用,我宁愿使用 perl 或类似的东西而不是解析 ls -l 输出。
    • @user2719058 如果stat 不可用,则perl 也不可用的可能性不存在。 POSIX 既没有指定stat 也没有指定perl,并且问题被标记为unix,这就是我坚持使用标准工具和选项的原因。虽然我同意解析 ls 输出通常是一个坏主意,但我相信我采取了足够的预防措施来避免在这种特定情况下的任何风险。
    • @jlliagre,不确定我是否同意 re:第一行——尽管我发现它令人反感,如果排除嵌入式系统 perl 比 GNU stat 广泛得多:它已经在商业 UNIX 上出现毕竟几十年来​​(而 stat 的非 GNU 实现在今天仍然很常见)。
    • @CharlesDuffy 我没有写出几率很高,只是它们确实存在。我的观点更多的是坚持使用POSIX 工具。 statperl 都不是。
    【解决方案2】:

    您可以使用stat 命令,无需使用AWK

    例如,在带有 Bash 的 Linux 中,myfile 是您的文件路径:

    sz=$(stat -c '%s' myfile)
    if [ $sz -eq 100 ]; then
        echo "myfile is 100 bytes"
    fi
    

    注意相等命令 -eq,它是 Bash 中的二元算术运算符。

    或者,您可以使用变量作为文件路径:

    f=my/file/path
    sz=$(stat -c '%s' $f)
    if [ $sz -eq 100 ]; then
        echo "$f is 100 bytes"
    fi
    

    【讨论】:

    • $sz 而不是myfile
    • 我能否像 sz=$(stat -c '%s' filepath/myfile) 那样指定文件的路径
    • @AbdulAshikKhanM 是的,您可以指定自己的文件名(路径)。
    • 需要更多报价。 stat -c '%s' "$f",或者带有空格的文件名将被拆分为stat 的多个参数。同样,使用[ "$sz" -eq 100 ] 而不是[ $sz -eq 100 ] 更安全,例如在stat 失败时从测试中获得更好的错误消息(或者在其他极端情况下更可靠的行为,例如IFS 中存在的数字值内的数字)。
    【解决方案3】:

    在变量中分配文件大小,然后使用 -eq 检查相等性

    size=`ls -l ${filepath}/{filename}.lst| awk '{print $5}'`
    if [ $size  -eq 461 ]
    then
       echo "MATCHED"
    else
      echo "NOT MATCHED"
    fi
    

    【讨论】:

    • 不,不要解析ls的输出。请改用stat
    • ...或者如果一个必须解析ls,则应该对此有适当的偏执,因为@jlliagre的答案是(处理以破折号开头的文件名,带有文字换行符的文件名与无法转义它们的ls 实现以及其他极端情况相结合),而这个答案不是。
    【解决方案4】:

    简单地说——

    var=$(ls -l ${filepath}/{filename}.lst | awk '{print $5}')
    

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多