Zip
如果 zip 存檔包含多個文件,則創建目錄
如果存檔在根目錄中包含多個文件,我想創建一個以文件名命名的目錄(不帶副檔名)。如果檔案只包含一個目錄,那麼我想簡單地提取它。假設我有以下存檔:
# 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 並右鍵點擊“在此處提取”。它的行為與應有的完全一樣。但不幸的是,我還沒有找到用於
unzip
或7z
產生相同行為的命令行開關。如何做到這一點?我可以使用其他工具(沒有 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 )
那是:
- 無論如何創建一個目錄
- 執行命令
- 取決於命令生成的文件數量:
- 刪除該目錄(如果它沒有創建任何文件)
- 如果它只創建了一個文件/目錄,將其上移一級並丟棄我們的目錄
- 否則,嘗試從臨時目錄的末尾刪除隨機字元串。
這樣,您可以執行以下操作:
unz unzip foo.zip unz tar xf foo.tar.gz
它假定提取命令的最後一個參數是要提取的文件。它還假定 GNU 工具用於
-v
選項。在非 GNU 系統上,您可以刪除它們並可能手動進行日誌記錄。mv -T
也是 GNU 特定的,並且只強制mv
嘗試進行重命名。