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
답변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이 말했듯이 이 스크립트는 강력하지는 않지만 간단한 경우에는 작동합니다.
유용하길 바랍니다.