목적:
a.zip
unzip
on 명령을 사용하여 아카이브를 확장한 후 Ubuntu 12.10
확장한 폴더의 이름을 변수 a.zip
에 할당합니다 .bash
v
a.zip
여러 폴더가 아닌 단일 폴더로의 확장을 가정하고 보장합니다.
예:
unzip a.zip
폴더로 확장된 경우 반환되어야 합니다 ./foo/
.echo $v
foo
내 환경:
GNU/Linux (kernel 3.5.0-25-generic)
Ubuntu 12.10
bash v4.2.37(1)-release
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
내 현재 솔루션은불행한with: Expand via unzip -d bar a.zip
then은 v=$(ls -1 bar)
올바른 결과를 제공하지만 파일 시스템을 엉망으로 만듭니다.
답변1
여기 있어요:
v=$(unzip a.zip | grep -m1 'creating:' | cut -d' ' -f5-)
설명하다
$(...)
캡처 셸입니다. 그 안에 있는 명령의 출력을 캡처하여 변수처럼 대체합니다.- 명령의 출력은
unzip
로 파이프되어grep
인수가 전달되어-m1
첫 번째 결과만 반환하고creating:
디렉터리가 생성될 때 stdout에 인쇄되는 텍스트의 일부인 text 를 반환합니다. 파이프로 연결된 stdout으로 인쇄합니다.unzip
grep
creating: foo/
cut
cut
두 번째 열 뒤의 모든 열을 인쇄하는 데 사용됩니다(공백으로 구분). 단어creating:
앞에 공백이 있기 때문에 5부터 줄 끝까지 지정합니다 . 디렉토리 이름에 공백이 포함된 경우 행 끝까지 모든 열을 사용하려고 합니다. 최종 출력은foo/
.
답변2
unzip -l
아카이브의 내용을 나열하고 출력을 구문 분석하는 데 사용할 수 있습니다.- 또는 디렉토리를 나열하고 디렉토리를 다시 나열하는 아카이브를 추출한 다음 다음을 사용하여 두 목록을 비교할 수 있습니다.
diff
답변3
이것AVFS/path/to/foo.zip
파일 시스템은 각 아카이브 파일이 디렉터리로 액세스할 수 있는 파일 시스템 보기를 제공합니다 ~/.avfs/path/to/foo.zip#
.
mountavfs
ls ~/.avfs$PWD/foo.zip\#
ls
명령이 단일 디렉터리를 표시하는 경우 zip 파일의 압축을 풀면 해당 디렉터리와 그 아래에 파일이 생성됩니다. zip 파일은 이런 방식으로 구성될 수도 있고 구성되지 않을 수도 있습니다.
dir
다음은 가정을 확인하고 해당되는 경우 디렉터리 이름을 설정하는 코드 조각입니다 . 경고: zip 파일에 이름이 .
(점 파일)로 시작하는 파일이 포함되어 있으면 해당 파일은 무시됩니다.
zip_directory_name () {
case $1 in
/*) ;;
*) set "$PWD/$1";;
esac
cd ~/.avfs${1}\# || exit 2
set -- *
if [ $# -eq 1 ] && [ -d "$1" ]; then
printf %s "$1"
else
return 1 # more than one top-level file, or a single non-directory
fi
}
dir=$(zip_directory_name foo.zip) || exit $?
답변4
원하는 경우 솔루션에 불만족스러울 수 있지만 실제로는 올바른 솔루션입니다.
d="`mktemp -d`"
unzip -d "$d" "$zipfile"
v="`basename "$d"/*`"
mv "$d"/"$v" "$v"
rmdir "$d"
echo "$v"
이것은 장황하지만 - zip 파일에 실제로 디렉토리가 하나만 있는 한(아마도 먼저 확인해야 함) 신뢰할 수 있습니다.
ls
그리고 grep
출력이 어떻게 보이는지에 따라 달라지므로 그다지 신뢰할 수 없습니다. 다른 로케일에서는 "creating:" 문자열이 없을 수도 있습니다. 다음 버전의 압축 해제에서는 어떤 이유로든 변경될 수 있습니다.