Zip

如果 zip 存檔包含多個文件,則創建目錄

  • April 29, 2014

如果存檔在根目錄中包含多個文件,我想創建一個以文件名命名的目錄(不帶副檔名)。如果檔案只包含一個目錄,那麼我想簡單地提取它。假設我有以下存檔:

# file: withdir.zip
somedir/alpha
somedir/beta
somedir/gamma

如果我將它提取到目前目錄中,我希望將其簡單地提取(unzip withdir.zip):

somedir/alpha
somedir/beta
somedir/gamma

現在假設以下存檔:

# file: nodir.zip
alpha
beta
gamma

當我執行時,unzip nodir.zip我最終將目前目錄與三個文件混為一談:

alpha
beta
gamma

我寧願跑unzip -d nodir nodir.zip

nodir/alpha
nodir/beta
nodir/gamma

如果我使用 nautilus 並右鍵點擊“在此處提取”。它的行為與應有的完全一樣。但不幸的是,我還沒有找到用於unzip7z產生相同行為的命令行開關。如何做到這一點?我可以使用其他工具(沒有 GUI)嗎?

我會做這樣的事情(zsh 語法):

unz() (
 tmp=$(TMPDIR=. mktemp -d -- ${${argv[-1]:t:r}%.tar}.XXXXXX) || exit
 print -r >&2 "Extracting in $tmp"
 cd -- $tmp || exit
 [[ $argv[-1] = /* ]] || argv[-1]=../$argv[-1]
 (set -x; "$@"); ret=$?
 files=(*(ND[1,2]))
 case $#files in
   (0) print -r >&2 "No file created"
       rmdir -v "../$tmp";;
   (1) mv -v -- $files .. && rmdir -v ../$tmp;;
   (*) mv -vT ../$tmp ../$tmp:r;;
 esac && exit $ret
)

那是:

  1. 無論如何創建一個目錄
  2. 執行命令
  3. 取決於命令生成的文件數量:
  • 刪除該目錄(如果它沒有創建任何文件)
  • 如果它只創建了一個文件/目錄,將其上移一級並丟棄我們的目錄
  • 否則,嘗試從臨時目錄的末尾刪除隨機字元串。

這樣,您可以執行以下操作:

unz unzip foo.zip
unz tar xf foo.tar.gz

它假定提取命令的最後一個參數是要提取的文件。它還假定 GNU 工具用於-v選項。在非 GNU 系統上,您可以刪除它們並可能手動進行日誌記錄。mv -T也是 GNU 特定的,並且只強制mv嘗試進行重命名。

引用自:https://unix.stackexchange.com/questions/64047