압축 해제시 압축 해제 / zip으로 하위 디렉토리를 만들지 않으려면 어떻게해야합니까?


19

zip 파일 작성 방법에 따라 때로는 모든 파일을 직접 추출하고 때로는 하위 디렉토리로 파일을 추출합니다.

후자가 사실이라면 어떻게 unzip명령이 첫 번째 레벨 디렉토리를 "무시" 하도록 강제 할 수 있습니까?

예:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll

내가 얻는 것은 /tmp/omeka/omeka-1.5.1/:

total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/

내가 원하는 것은에 압축이 풀린 파일입니다 /tmp/omeka/(디렉토리 구조에 한 수준 높이고 버전 번호가 포함되어 있지 않습니다)

/tmp/omeka/(files)

-j"정크 경로"옵션을 사용할 수 있지만 최상위 디렉토리 구조가 아닌 하위 디렉토리 구조를 유지하려고합니다. 어떻게해야합니까?


PS : 나는 그때 추출 할 수 있음을 알고 있어요 mv파일을하지만, 바로 압축 해제 명령이 할 수있는 방법이 있다면 내가보고 싶어
CWD

나도 몰라 그러나 파일 이름이 항상 확장명을 제외하고 디렉토리 이름과 일치하는 경우 추출 된 디렉토리의 이름을 스크립팅하는 것이 매우 간단합니다.
Mat

3
당신이하려는 일을 보았지만 권장하지는 않습니다. 프로젝트 소스에서 버전 번호를 제거하는 것은 나쁜 생각입니다. 버전 정보없이 더 짧은 이름을 원하면 정상적으로 추출하고 ln -s를 사용해야합니다. 이렇게하면 항상 실행중인 버전을 알 수 있으며 링크를 전환하여 새 버전으로 쉽게 업데이트 할 수 있습니다.
Burton Samograd

@BurtonSamograd-이상적이지만, 일부 소프트웨어, Wordpress를 예로 들어 모든 버전을 /wordpress/zip 파일 의 디렉토리 (버전 번호 없음)에 넣기 때문에 효과적인 방법이 있다면 여전히 궁금 합니다. 그것은 참으로 괜찮 unzip하고 mv있지만, 이것의 통제가없는 항상 내 신경을 조금을 얻었다 두 단계에서 그것을 할 필요. 다행스럽게도 Wordpress도 .tar.gz맛이납니다 :)
cwd

시도cd /tmp/omeka && ln -s -T . omeka-1.5.1
James Youngman

답변:


4

AVFS 와 같은 디렉토리와 같은 아카이브를 찾아 볼 수 있는 FUSE 파일 시스템을 사용하십시오 . 선택한 디렉토리에 파일을 추출하는 데 사용하십시오 .cp

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

아카이브에 단일 최상위 디렉토리가 있다고 가정하므로이를 단축 할 수 있습니다.

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka

@Giles 당신은 전문가가 누구도 대답 할 수없는 모든 질문에 대답합니다. 이것이 진정한 방법 일 것입니다. 나는 unzip추출 할 파일을 지정하는 것과 같이 */*다른 유틸리티를 설치하지 않고 사용할 수 있는 마술을 원했지만 그렇지는 않습니다. 감사. +1
cwd

6

zip 파일에 디렉토리 구조가 없거나 보존 할 필요가없는 경우 다음을 사용할 수 있습니다.

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
unzip -j omeka-1.5.1.zip -d omeka
cd omeka
ll

3

이 스크립트는 강력하지는 않지만 간단한 경우에는 작동합니다.

...
dest=omeka
unzip omeka-1.5.1.zip -d $dest/

if [ `ls $dest | wc -l` == 1 ]; then
  subdir=`ls $dest`
  mv $dest/$subdir/* $dest/
  rmdir $dest/$subdir
fi

정확히 하나의 서브 디렉토리가 있는지 확인하고, 있으면 서브 디렉토리를 모두 위로 이동 한 후 삭제합니다.


2

방금 오늘 등록 했으므로 @SteveBennet 답변을 찬성 할 수 없으며 의견을 추가 할 수 없습니다.

그의 대답을 바탕으로 다음과 같이 재귀 함수를 만들었습니다.

...

shopt -s dotglob # To include hidden files in the move command

function moveSub {
  local dest=$1
  if [ `ls $dest | wc -l` == 1 ]; then
    local subdir=`ls $dest`
    moveSub "$dest/$subdir"
    mv $dest/$subdir/* $dest/
    rmdir $dest/$subdir
  fi
}

moveSub "$dest"

@SteveBennet이 말한 것처럼 :이 스크립트는 강력하지는 않지만 간단한 경우에는 작동합니다.

유용하기를 바랍니다.


1

patch --strip=n옵션 처럼 보입니다

처음에 경로 구성 요소 를 잘라내 는 옵션 patch --strip=number(또는 -pnumber) 과 같은 옵션을 사용하는 것이 바람직합니다 ( 파일 비교 및 ​​병합 : 패치 디렉토리 참조 ).number

다른 솔루션, 적용 성

실패하면 해킹 같은 또 다른 솔루션이 있지만 작동합니다. 필자의 경우 전체 zip을 먼저 추출하지 않고 기존 파일로 가득 찬 디렉토리를 zip의 내용으로 덮어 쓰고 싶었습니다.

이 솔루션이 작동하고 @Gilles의 솔루션을 사용할 수있는 경우 후자가 작동합니다. 그러나이 솔루션에는 FUSE 파일 시스템의 가용성이 필요하지 않습니다.

그것을하는 방법

여분의 디렉토리를 알고 있다고 가정하면 다음 omeka-1.5.1과 같이 할 수 있습니다.

mkdir omeka
ln -s . omeka/omeka-1.5.1 # create a symlink that redirects output
unzip omeka-1.5.1.zip -d omeka/
rm omeka/omeka-1.5.1 # remote symlink

unzip압축을 풀기 위해 omeka-1.5.1실제로 dir을 포함하는 심볼릭 링크입니다. 결과적으로 파일이 omeka직접 들어갑니다.

가능한 변형

Depeer 계층의 하나 이상의 부분을 리디렉션하는 변형을 상상할 수 있습니다.

ln -s ../myfoo omeka/omeka-1.5.1/foo
ln -s ../../mybarxyzzy omeka/omeka-1.5.1/subdir/bar

결론

이 솔루션은 다소 구체적이지만 사용 사례가 있으며 방금 사용했습니다.


경로를 알고 있으면 훌륭한 솔루션입니다!
grepsedawk

zip 내용을 먼저 나열하여 경로를 검사 할 수 있습니다 (예 :) unzip -l. 일반적인 경로의 일부를 알아내는 스크립트를 사용하여 자동화 할 수도 있습니다.
Stéphane Gourichon

아시다시피, 경로를 안다면 훨씬 쉬울 것입니다. 나는 unzip -l을 약간 가지고 놀았지만 의도했던 것보다 조금 더 grep / sed / awk였습니다.
grepsedawk

zipinfo -1좋은 시작일지도 모른다. 사용 사례는 무엇입니까?
Stéphane Gourichon

github.com/grepsedawk/wow-config/blob/… 이 경우 디렉토리를 알고 있습니다 :)
grepsedawk

1

다음 unzip과 같이 -j옵션 을 사용하여 실행하려고 할 것 입니다.

unzip -j files.zip -d ./output/

그러나 그 행동에 놀랄 수도 있습니다.

-j 정크 경로. 아카이브의 디렉토리 구조는 다시 작성되지 않습니다. 모든 파일은 추출 디렉토리 (기본적으로 현재 디렉토리)에 저장됩니다.

files.zip출력 디렉토리에서 추출 ./output하여 결과로 얻은 경우 :

./output/files/subfolder1/f1
./output/files/subfolder1/f2

다음 -j옵션 (모든 경로가 스트라이프) 당신이 줄 것이다 :

./output/f1
./output/f2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.