여러 경우에 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
zipinfo
zip 내용을 표시하는 데 사용합니다 .:
$ 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의 제안이 아마도 더 나을 것입니다. 방금 내 명령이 파일이 하위 폴더에 포함되어 있는지 확인하지만 모든 파일이 동일한 루트 폴더에 포함되어 있는지 확인하지 않는다는 것을 깨달았습니다.