압축을 풀 때 하위 디렉토리를 생성하지 않도록 unzip/zip을 강제하는 방법은 무엇입니까?

압축을 풀 때 하위 디렉토리를 생성하지 않도록 unzip/zip을 강제하는 방법은 무엇입니까?

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최상위 디렉터리 구조가 아닌 하위 디렉터리 구조를 유지하고 싶습니다. 어떻게 해야 하나요?

답변1

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

답변2

사용하다퓨즈디렉토리와 같은 아카이브를 찾아볼 수 있는 파일 시스템입니다.AVFS. 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

답변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

단지 하위 디렉토리가 존재하는지 확인하고 존재한다면 모든 것을 하위 디렉토리 밖으로 이동한 다음 삭제합니다.

답변4

오늘 막 가입했기 때문에 @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이 말했듯이 이 스크립트는 강력하지는 않지만 간단한 경우에는 작동합니다.

유용하길 바랍니다.

관련 정보