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
その後、一時ファイルを削除できます。
警告:テストされていないコードです。