.zip에 상위 디렉터리가 내부에 있는지 미리 확인하는 방법

.zip에 상위 디렉터리가 내부에 있는지 미리 확인하는 방법

여러 경우에 I have 라고 하면 a.zip압축이 풀 a/*립니다.

그러나 모든 내용을 현재 디렉터리에 유출하는 zip 파일이 있는 경우가 많습니다. 이를 위해서는 수동으로 디렉터를 생성 a하고 압축을 풀어야 합니다.

그러나 정책에 따라 항상 디렉토리를 생성하고 zip이 첫 번째 종류인 것으로 밝혀지면 내 구조는 a/a/*이상적이지 않은 것처럼 보입니다.

위에서 설명한 두 가지 유형 중 유형에 관계없이 압축 a.zip을 풀 수 있는 방법이 있나요 ?a/*

답변1

이 시도:

archive="archive.zip"
has_parent=$(unzip -l "$archive" | tail -n+4 | head -n-2 | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
if test "$has_parent" -eq 1; then
  unzip $archive
else
  dir="./$(basename ${archive%%.zip})"
  mkdir "$dir"
  unzip -d "$dir" $archive
fi

사용하는 경우 다음 줄을 zipinfo짜낼 수 있습니다 .$has_parent

has_parent=$(zipinfo -1 "$archive" | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)

아이디어는 간단합니다. 아카이브의 루트 수준에 여러 개의 파일이 있는 경우 압축을 풀면 현재 디렉터리가 삭제되므로 미리 상위 디렉터리를 만들고 거기에 파일의 압축을 풀어야 합니다. 그렇지 않고 아카이브의 모든 파일이 동일한 상위 파일을 갖고 있다면 현재 디렉토리에 압축을 풀어도 괜찮습니다.

답변2

zipinfozip 내용을 표시하는 데 사용합니다 .:

$ zipinfo -1 a.zip

그러나 자동화 답변을 찾고 있다면 이것이 귀하의 질문에 대한 답변이 아닐 수도 있습니다.

편집하다:당신이 할 수 있는 일은 출력의 각 줄에서 zipinfo슬래시 문자를 확인하는 것입니다. 해당 문자가 누락된 줄이 있으면 해당 문자가 zip 파일의 루트에 있다는 것을 알 수 있습니다.

불행하게도 나는 머리 꼭대기에서 이 작업을 수행하는 방법을 정확히 생각할 수 없습니다. 작동할지 확실하지 않지만 테스트되지 않은 명령은 다음과 같습니다.

$ MKROOT=0
$ for X in $(zipinfo -1 a.zip); do $(echo "${X}" | grep "/"); if test "$?" -gt "0"; then MKROOT=1; fi; done
$ if test "${MKROOT}" -gt "0"; then mkdir "a"; cd "a"; unzip "../a.zip"; else unzip "a.zip"; fi

편집하다:Mark Perryman의 제안이 아마도 더 나을 것입니다. 방금 내 명령이 파일이 하위 폴더에 포함되어 있는지 확인하지만 모든 파일이 동일한 루트 폴더에 포함되어 있는지 확인하지 않는다는 것을 깨달았습니다.

관련 정보