【问题标题】:Unix stat error "stat: illegal option -- -"Unix stat 错误“stat:非法选项--”
【发布时间】:2016-03-18 17:45:25
【问题描述】:

因为我对 shell 编程很陌生,所以我完全迷失了这个错误:

stat: illegal option -- -
usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file ...]

当我在 FreeBSD 上运行脚本时会发生此错误。它在 CentOS 上运行良好。

这是我正在使用的代码

for i in `find "$1" -name "$2" -type f ! -name "$3" -print0 | xargs -0 stat --format="%s" | sort -n| awk {print}`; do 
    size_array[$j]=$i
    ((j=j+1))

基本上做的是将所有文件的大小加载到数组中。所以我将能够计算所有文件大小的中位数。所以这应该以字节为单位显示文件大小。

stat --format="%s" 

我用什么语法来消除这个错误?

如果有人能帮助我,我将不胜感激。谢谢

【问题讨论】:

    标签: bash unix freebsd xargs


    【解决方案1】:

    您正在使用非标准的“长选项”。 --format 之类的选项在 GNU 实用程序中很常见,但不是标准选项。 Linux 上的许多命令行实用程序都来自 GNU。

    通常短选项-f 可以跨平台工作。但是stat(1) 也是非标准的!对于 CentOS,您似乎需要 --format-c

    您需要使用uname(1) 之类的内容来测试操作系统版本。不幸的是,当您使用非标准功能时会发生这种情况。

    编辑:

    这是一个应该在任何地方都可以使用的替代方法,我认为可以满足您的需要:

    declare -A size_array
    i=0
    
    for fname in $(find "$1" -name "$2" -type f \! -name "$3" -print)
    do
        size_array[$i]=$(ls -l "$fname"|awk '{print $5}')
        (( i++ ))
    done
    
    echo ${size_array[@]}
    

    ! 被转义(\ 前缀),因为它是 bash 中的特殊字符。与其使用数组计数 ($i),不如使用+= 附加到数组,但这仅在更高版本的 bash 中可用。是的,您可能可以在一条长线中完成所有工作,但这样做没有任何优势,而且很难调试。

    【讨论】:

    • 所以我想我必须以某种方式重写它。谢谢
    • @FilipMik:如果您要跨越 Linux 和 FreeBSD 之间的平台,那么您可能会发现其他不兼容的地方。如果脚本必须是可移植的,那么我建议您根据操作系统编写条件代码。您可以使用各种环境变量,以及来自uname(1) 的输出。
    • 顺便说一句,反引号` 字符已被弃用,请改用$( ... ),因为它更易于阅读。
    • @FilipMik:建议在帖子中替代
    • 非常感谢,你帮了我很多:) 有点挣扎
    猜你喜欢
    • 2012-05-26
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多