効率的なクロスOSファイルサイズシェル機能

効率的なクロスOSファイルサイズシェル機能

オペレーティングシステム全体でファイルサイズを確認するより簡単な方法を探しています。 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
}

ベストアンサー1

wcGNU coreutilsのソース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.

したがって、wc -cバイト数を使用するとうまくいきます。

大容量ファイル(読み取りに時間がかかるファイルなど)でこの最適化を簡単にテストできます。 9.9Gbファイルは私のサーバーwc -cでリアルタイムで0.015秒かかりました。その時点でファイル全体を転送できると嬉しいですが、残念ながら私のギガビットイーサネット速度はそうではありません。/dev/nullネットワーク)。

おすすめ記事