.zip 내부에 상위 디렉토리가 있는지 미리 아는 방법

.zip 내부에 상위 디렉토리가 있는지 미리 아는 방법

몇 번, 내가 가지고 있다고 말하면 압축이 풀릴 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

zipinfo콘텐츠를 표시하고 압축하는 데 사용됩니다 .

$ 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의 제안이 더 나을 수도 있습니다. 방금 내 명령이 파일이 하위 폴더에 포함되어 있는지 확인하지만 모든 파일이 동일한 루트 폴더에 포함되어 있는지 확인하지는 않는다는 것을 깨달았습니다.

관련 정보