生成SFV文件,优化硬链接

生成SFV文件,优化硬链接

我当前正在运行cfv -C -rr生成一个 SFV 文件,其中包含所有子目录中所有文件的 CRC32 校验和。问题是,由于硬链接太多,这个过程花费的时间比应有的时间要长得多。有什么办法让 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

然后您可以删除临时文件。

警告:未经测试的代码。

相关内容