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

그런 다음 임시 파일을 삭제할 수 있습니다.

경고: 테스트되지 않은 코드입니다.

관련 정보