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
그런 다음 임시 파일을 삭제할 수 있습니다.
경고: 테스트되지 않은 코드입니다.