SFVファイルの生成とハードリンクの最適化

SFVファイルの生成とハードリンクの最適化

cfv -C -rr現在、すべてのサブディレクトリ内のすべてのファイルのCRC32チェックサムを含むSFVファイルを生成するプログラムを実行しています。問題は、ハードリンクが多すぎるため、このプロセスが予想よりもはるかに長くかかることです。 cfvにハードリンクを無視させる方法はありますか?

cfvを見つけることができますここ。マニュアルページにはハードリンクは記載されていません。他のアプリもありますか?

ベストアンサー1

ファイル名に改行、最初の文字または末尾のスペースが含まれておらず(SFV形式はとにかくこれらをサポートしていません)、GNUユーティリティ(含まれていないLinux、Cygwin)があるとします。

まず、ファイル名とinode番号のマッピングが作成され、inode番号でソートされます。

tmpdir=$(mktemp -d)
find .* * -xdev -name .. -prune -o -type f -printf '%i %p\n' |
sort -k 1n > "$tmpdir/inodes.txt"

最初のファイルの各 inode 番号のチェックサムファイルを生成します。

<"$tmpdir/inodes.txt" awk '$1 != previous {previous = $1; sub(/^[0-9]+ /,""); print}' |
xargs cfv -C - >"$tmpdir/1.cfv"

これで、ハードリンクを使用してチェックサムファイルを完成させます。cfvファイルがコマンドラインに渡された順序で印刷されるかどうかはわかりません。その場合、一時CFVファイルとinodeファイルが同じ方法でソートされるため、この段階でメモリを節約できます。

awk '
    FNR==1 {
        match($0, / +[[:alnum:]] *$/);
        cksums[substr($0, 1, RSTART-1)] = substr($0, RSTART);
        next
    }
    { inode = $1; sub(/^[0-9]+ /, ""); }
    previous != inode { cksum = cksums[$0] }
    { print $0, cksum }
' "$tmpdir/1.cfv" "$tmpdir/inodes.txt" >full.cfv

その後、一時ファイルを削除できます。

警告:テストされていないコードです。

おすすめ記事