파일의 압축을 풀고 어떤 디렉터리를 만들까요?

파일의 압축을 풀고 어떤 디렉터리를 만들까요?

목적:

a.zipunzipon 명령을 사용하여 아카이브를 확장한 후 Ubuntu 12.10확장한 폴더의 이름을 변수 a.zip에 할당합니다 .bashv

a.zip여러 폴더가 아닌 단일 폴더로의 확장을 가정하고 보장합니다.

예:

unzip a.zip폴더로 확장된 경우 반환되어야 합니다 ./foo/.echo $vfoo

내 환경:

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.zipthen은 v=$(ls -1 bar)올바른 결과를 제공하지만 파일 시스템을 엉망으로 만듭니다.

답변1

여기 있어요:

v=$(unzip a.zip | grep -m1 'creating:' | cut -d' ' -f5-)

설명하다

  • $(...)캡처 셸입니다. 그 안에 있는 명령의 출력을 캡처하여 변수처럼 대체합니다.
  • 명령의 출력은 unzip로 파이프되어 grep인수가 전달되어 -m1첫 번째 결과만 반환하고 creating:디렉터리가 생성될 때 stdout에 인쇄되는 텍스트의 일부인 text 를 반환합니다. 파이프로 연결된 stdout으로 인쇄합니다.unzipgrepcreating: 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:" 문자열이 없을 수도 있습니다. 다음 버전의 압축 해제에서는 어떤 이유로든 변경될 수 있습니다.

관련 정보