高效的跨操作系统文件大小shell函数

Nei*_*ill 4 bash shell-script files

我正在寻找一种更简单的方法来进行跨操作系统的 unix 文件大小检查。我可以使用 wc -c 但我担心大文件的性能可能会很差(我假设它只计算字符并且不做统计?)

以下适用于 linux 和 macos(可能是 bsd)。有没有更简单的表现良好的方法?

function filesize
{
    local file=$1
    size=`stat -c %s $file 2>/dev/null` # linux
    if [ $? -eq 0 ]; then
        echo $size
        return 0
    fi

    eval $(stat -s $file) # macos
    if [ $? -eq 0 ]; then
        echo $st_size
        return 0
    fi

    echo 0
    return -1
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 5

来自GNU coreutils中wc( coreutils/src/wc.c)的来源(即非嵌入式 Linux 和 Cygwin 上的版本):

 When counting only bytes, save some line- and word-counting
 overhead.  If FD is a 'regular' Unix file, using lseek is enough
 to get its 'size' in bytes.
Run Code Online (Sandbox Code Playgroud)

所以使用wc -c来计算字节会表现得很好。

您可以在一个大文件(即需要一些时间阅读的文件)上轻松测试此优化。wc -c在一个 9.9Gb 的文件上,我的服务器上的一个文件需要 0.015 秒的实时时间,如果整个文件都在那个时候传输,我会很高兴,但不幸的是,我的千兆以太网并没有那么快(需要 21 秒才能传输)将该文件复制到/dev/null网络上)。

  • 并不是所有的 `wc` 实现都会这样做。您可能还想首先确保该文件是常规文件。 (2认同)