디스크 공간을 너무 많이 사용하지 않고 busybox의 tar 아카이브 내에서 파일의 sha1 체크섬을 생성하는 방법

디스크 공간을 너무 많이 사용하지 않고 busybox의 tar 아카이브 내에서 파일의 sha1 체크섬을 생성하는 방법

목록 형식의 간단한 tar 아카이브에 있는 모든 파일의 sha1 체크섬을 얻고 싶습니다.

이는 최소한의 tar 바이너리만 사용할 수 있는 비지박스 머신에서 수행되어야 합니다.http://linux.die.net/man/1/busybox사용 가능한 명령을 가져옵니다.

대용량 tar 파일의 압축을 풀기 위해 디스크 공간을 사용할 필요가 없습니다. 파이프가 있고 즉시 sha1을 계산하여 출력을 /dev/null로 보냅니다.

이를 통해 네트워크를 통해 파일을 복사하거나 추출할 필요 없이 백업을 확인할 수 있습니다. 두 작업 모두 리소스를 소모합니다.

이것은 기본적으로 같은 질문입니다.디스크 공간을 너무 많이 사용하지 않고 tar 아카이브 내에서 파일의 sha1 체크섬을 생성하는 방법좋은 답변이 있지만 나중에 busybox tar 바이너리가 해당 옵션이 없는 최소 버전이라는 것을 깨달았습니다 --to-command=sha1sum.

답변1

tar tf test.tar|while read file;do echo $file $(tar xOf test.tar $file|sha1sum);done 

답변2

이 솔루션의 주요 문제는 다음과 같습니다.

tar tf test.tar|while read file;do echo $file $(tar xOf test.tar $file|sha1sum);done

1-busybox의 tar는 개행 문자가 포함된 다른 파일 이름을 표시할 수 없습니다.

2- 셸에서 "읽기"하면 백슬래시가 올바르게 처리되지 않습니다. ("\" 문자가 먹히거나 "\n"이 개행 문자로 대체됩니다)

3- 큰따옴표가 없는 쉘 변수는 반복되는 공백 문자를 먹습니다.

문제 1을 해결할 수 없습니다.

어쨌든 2번과 3번은 고칠 수 있어요.

다음 쉘 스크립트를 작성하십시오: "tarsha1.sh"("chmod 755 tarsha1.sh"를 잊지 마십시오)

#!/bin/sh
tarname="$1"
shift
for filename in "$@"
do tar xOf "$tarname" "$filename" | sha1sum | head -c -3
   printf '%s\n' "$filename"
done

그런 다음 다음 명령을 사용하십시오.

tar tf test.tar | tr '\n' '\0' | xargs -0 -r ./tarsha1.sh test.tar

이렇게 하면 줄 바꿈("\n")을 제외한 모든 문자로 파일 이름을 처리할 수 있습니다.

참고: xargs의 "-0" 옵션은 busybox 컴파일 옵션에서 활성화되어야 합니다.

관련 정보