Bash: 아카이브 루트가 폴더인지 또는 포함된 파일인지 확인

Bash: 아카이브 루트가 폴더인지 또는 포함된 파일인지 확인

모든 아카이브에 공통 추출 기능을 제공하려고 합니다. 하지만 추출하기 전에 다음을 확인하고 싶습니다. 아카이브의 루트가 폴더인지 파일인지 확인하세요. 아카이브의 루트 폴더에 파일이 없으면 있는 그대로 추출됩니다. 그러나 아카이브의 루트가 파일이거나 파일과 폴더가 모두 포함된 경우 아카이브와 동일한 이름의 새 폴더를 생성하고 해당 폴더에 아카이브를 추출합니다.

확인 방법은 모든 주요 아카이브 *.tar.bz2 *.tar.gz *.bz2 *.rar *.gz *.tar *.tbz2 *.tgz *.zip *.Z *.7z * *.tar에 대해 작동해야 합니다.

내가 사용하고 있는 tar 기반 아카이브의 경우

ex() {
if [[ -z "$(tar -ztf "$1" | sed '/\//d')" ]]; then tar -zxvf "$1"; else tar -zxvf "$1" -C DIR; fi
}

답변1

zsh 스크립트 가 있습니다 unz.

#! /bin/zsh -
tmp=$(TMPDIR=. mktemp -d -- ${${argv[-1]:t:r}%.tar}.XXXXXX) || exit
print -ru2 Extracting $argv[-1] in $tmp
cd -- $tmp || exit
[[ $argv[-1] = /* ]] || argv[-1]=../$argv[-1]
(PS4='Running '; set -x; "$@"); ret=$?
files=(*(NDY2))
case $#files in
  (0) print -u2 No file created
      rmdir -v "../$tmp";;
  (1) print -u2 Only one file/dir extracted at the top level.
      mv -v -- $files .. && rmdir -v ../$tmp;;
  (*) print -u2 More that one file/dir extracted at the top level.
      mv -vT ../$tmp ../$tmp:r;;
esac && exit $ret

다음과 같이 사용됩니다:

unz tar xf file.tgz
unz unzip file.zip

등.

아이디어는 최상위 수준에서 여러 파일을 추출할 때만 보관되는 임시 디렉토리에 아카이브를 추출하는 것입니다.

(GNU 가정 mv/ rmdir)

관련 정보