압축 파일의 압축을 풀 때 대상 폴더에 완전히 압축이 풀린 파일만 가져오는 방법은 무엇입니까?

압축 파일의 압축을 풀 때 대상 폴더에 완전히 압축이 풀린 파일만 가져오는 방법은 무엇입니까?

각각 128MB, 100개가 넘는 파일이 포함된 대용량 zip 파일의 압축을 풀려고 합니다. 압축 해제가 중단되면 압축 해제 중인 마지막 파일을 삭제한 다음 다시 시작하고 다음과 같이 기존 파일을 건너뛰는 옵션을 활성화해야 합니다.

unzip -n my_compressed_file.zip -d destination

완전히 압축이 풀린 파일만 대상 디렉터리에 나타나도록 zip 파일의 압축을 풀 수 있는 방법이 있습니까?

답변1

파일을 임시 위치로 추출하고 파일이 완료된 후에만 최종 대상으로 이동하는 래퍼 스크립트를 작성할 수 있습니다. 그것은 마치

tempdir="incomplete/"

mkdir -p "$tempdir"
zipinfo -1 compressed.zip | while read f ; do
        test -f "$f" && continue # skip anything extracted by a previous attempt
        printf "extracting %s..." "$f"
        unzip -p compressed.zip "$f" > "$tempdir/$f"
        printf "done!\n"
        mv "$tempdir/$f" "$f"
done
rm -r "$tempdir"

이 작업이 중단되면 여전히 부분 파일이 남지만 다시 실행하면 전체 파일(올바른 위치)을 건너뛰고 부분 파일(임시 디렉터리)을 즉시 덮어씁니다. 마침내 아카이브의 끝에 도달하면 임시 디렉토리가 완전히 삭제됩니다.

내 예제 스크립트에는 몇 가지 제한 사항이 있습니다. zip에는 자체 디렉터리 구조가 포함되어 있지 않으며 incomplete/작업 폴더 내의 임시 디렉터리를 사용한다고 가정합니다. 이것이 허용되지 않는 경우, 귀하는 다음을 수행해야 합니다.

  • tempdir동일한 파일 시스템 어딘가에 있고(원자성을 허용하기 위해 mv) 다른 프로세스에서 사용되지 않는 다른 값을 사용합니다 .
  • mkdir추출된 디렉터리 구조를 재구성하려면 루프 내부에 추가 단계를 추가하세요.

당신은 또한 볼 수 있습니다내 fs에 mv 원자가 있습니까?

관련 정보