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

おすすめ記事