zip을 7zip으로 다시 패키지하는 방법은 무엇입니까?

zip을 7zip으로 다시 패키지하는 방법은 무엇입니까?

zip 아카이브를 7zip 아카이브로 안전하고 빠르게 재패키징하는 방법은 무엇입니까?

7zip 프로그램 옵션을 확인했는데 재포장 옵션이 표시되지 않았습니다. 디렉토리에 압축을 풀고 디렉토리를 패키지화할 수 있다는 것을 알고 있지만 안전합니까? ZIP 파일에 "../../file.exe" 또는 "/etc/bin/file.exe"와 같은 경로가 있으면 어떻게 되나요?

파일의 압축을 풀고 표준 출력으로 시도했는데 7zip 프로그램이 그렇게 할 수 있지만 이름 등이 아닌 파일의 내용만 출력합니다. 따라서 이 출력을 가져와서 7zip 아카이브로 패키징할 다른 위치로 리디렉션할 수는 없습니다.

답변1

arepackatool 도구 모음에서 이 도구를 간단히 사용할 수도 있습니다 . 일반적 으로 yum install atool또는 를 통해 apt-get install atool설치 됩니다. 사용 가능해지면 간단히 다음을 수행할 수 있습니다.

$ arepack -e -F 7z *.zip

그러면 모든 .zip 파일이 .7z 파일로 변환됩니다. 여전히 *.zip 파일을 삭제해야 하지만 다음과 같이 간단하게 수행할 수 있습니다.

$ rm -f *.zip

추가 아카이브 옵션

Options:
  -e, --each               execute command above for each file specified
  -F, --format=EXT         override archive format (see below)
  -O, --format-option=OPT  give specific options to the archiver
  -D, --subdir             always create subdirectory when extracting
  -f, --force              allow overwriting of local files
  -q, --quiet              decrease verbosity level by one
  -v, --verbose            increase verbosity level by one
  -V, --verbosity=LEVEL    specify verbosity (0, 1 or 2)
  -p, --page               send output through pager
  -0, --null               filenames from standard in are null-byte separated
  -E, --explain            explain what is being done by atool
  -S, --simulate           simulation mode - no filesystem changes are made
  -o, --option=KEY=VALUE   override a configuration option
      --config=FILE        load configuration defaults from file

Archive format (for --format) may be specified either as a
file extension ("tar.gz") or as "tar+gzip".

답변2

임시 디렉토리에 추출해야 합니다.

에 따르면 unzip (1),

보안상의 이유로 압축을 풀면 일반적으로 추출된 파일 이름에서 "상위 디렉터리" 경로 구성 요소("../")가 제거됩니다. 이 보안 기능(버전 5.50의 새로운 기능)은 unzip이 활성 추출 폴더의 트리 헤드 외부에 있는 "민감한" 영역에 실수로 파일을 쓰는 것을 방지합니다.

그래서 가능하긴 하지만안전한7z을 사용하면 결과 에 파일이 다르게 정렬되거나 파일 이름이 중복되면 결과가 손실될 수도 있습니다 .

다음은 예제 스크립트이지만 ..절대 경로 문제를 무시합니다.

#!/bin/sh
set -e
if [ "$1" == "" -o "$2" == "" ]
then
    echo Usage: $0 archive.zip archive.7z
    exit 1
fi
scratch=`mktemp -d`
trap "rm -rf $scratch" EXIT
in=`readlink -f $1`
out=`readlink -f $2`
if [ -f $out ]
then
    echo $out exists.
    exit 2
fi
unzip -d"$scratch" "$in"
cd "$scratch"
7z a "$out" .

관련 정보