15

分享幾個常用的 7-Zip 壓縮與解壓縮命令

 3 years ago
source link: https://blog.miniasp.com/post/2021/07/07/Useful-7-Zip-7z-CLI-Command-Options
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

我們最近幾年幾乎所有案子都導入 CI/CD,把所有能自動化的工作全部都指令化,所以只要公司需要開發時期用的測試機,或是客戶需要安裝主機,通常都可以在 10 分鐘內搞定所有環境與設定。今天這篇文章我要來分享幾個常用的 7-Zip 命令與參數,因為 7-Zip 在第一次使用 7z 命令的時候,他的使用方式比較沒那麼直覺,所以寫成文章供未來查表參考之用。

安裝 7-Zip 工具

一如往常的,我幾乎都使用 Chocolatey 進行安裝 7-Zip 套件:

choco install 7zip -y

請注意要輸入 7zip 才是正確的套件名稱喔,這裡的 7zip 中間不能加上 Dash 符號 (-)!

你也可以用微軟最近推出的 Windows Package Manager CLI 安裝 7-Zip 工具

winget install 7zip

Windows Package Manager 1.0 | Windows Command Line

常用的壓縮檔案命令與參數

  1. 壓縮整個資料夾,而且壓縮檔案中的第一層就是該資料夾

    這意味著壓縮檔中第一層目錄中沒有檔案,只有一個資料夾!

    會這樣壓縮,通常是因為「解壓縮的人」經常會使用「解壓縮到這裡」的方式進行解壓縮,如果他把壓縮檔放在「桌面」上,解壓縮的時候就會看到桌面上只有一個檔案,看起來比較乾淨。

    壓縮 dir1\ 資料夾下所有檔案,而且壓縮檔案中會看到 dir1 這個資料夾!

    7z a "dir1.zip" "dir1\"
    

    如果你用以下命令壓縮,將會在壓縮檔中看到 dir1dir2 資料夾等路徑!

    7z a "dir1.zip" "dir1\dir2\"
    

    7-Zip 預設會壓縮該目錄與所有子目錄的所有檔案!

    如果要壓縮成 *.7z 格式,不用特別下參數,直接設定好壓縮檔的副檔名即可,例如:

    7z a "dir1.7z" "dir1\"
    

    注意:7-Zip 支援 *.rar 的解壓縮,但不能使用 RAR 格式進行,因為 RAR 壓縮格式有專利保護!

  2. 壓縮整個資料夾,而且壓縮檔案中第一層就是該資料夾下所有檔案與子資料夾

    我個人比較喜歡這樣壓縮檔案,許多雲端平台在上傳檔案部署的時候,也會要求要用這種方式壓縮才能正常部署。

    壓縮 dir1\ 資料夾下所有檔案,壓縮檔案不會看到 dir1 這個資料夾,只會看到裡面的檔案與子資料夾!

    7z a "dir1.zip" "dir1\*"
    

    如果你用以下命令壓縮,將會看不到 dir1dir2 資料夾!

    7z a "dir1.zip" "dir1\dir2\*"
    
  3. 壓縮整個資料夾,並且保留現有檔案的完整路徑

    由於 7-Zip 壓縮過的檔案不會保留「磁碟代號」,你唯一能做的只能保留「路徑」部份而已。

    你可以先進入磁碟的根目錄,然後用上述第 1 種方法來壓縮檔案:

    CD /D G:\
    7z a "dir2.zip" "sub1\dir1\dir2"
    
  4. 只壓縮整個資料夾下的特定檔案類型

    如果要壓縮限定特定類型的檔案,可以先加上 -r 參數,再加上不同的檔名樣式 (File Patterns) 就可以找出檔案並加入壓縮檔:

    7z a "dir1.zip" "dir1\" -r "dir1\*.aspx"
    
    7z a "dir1.zip" "dir1\" -r "dir1\*.aspx" "dir1\*.dll"
    

    如果要排除特定類型的檔案不要進壓縮檔,可以這樣寫:

    7z a dir1.zip "dir1\" "-xr!*.pdb" "-xr!web.config"
    
  5. 將目前資料夾下的所有檔案壓縮到上一層目錄

    如果你想壓縮當前目錄,但是壓縮檔不要出現在本資料夾,可以這樣寫:

    7z a "..\dir1.zip"
    

    不加上任何參數,預設就是把當前目錄全部都壓縮起來,但請記得壓縮檔不要放在當前目錄下!

常用的解壓縮檔案命令與參數

  1. 解壓縮到當前目錄

    請確保不會弄亂你的資料夾才能用這個方法,因為解出來的東西會跟壓縮檔放在一起!

    7z x "dir1.zip"
    
  2. 解壓縮到指定輸出目錄

    7z x "dir1.zip" -o"dir1"
    

    請記得習慣在 -o 參數後面加上 " 雙引號,這樣就可以確保資料夾路徑中有空白字元也可以正常運作!

    7z x "dir1.zip" -o"C:\Program Files\"
    

    注意:在 -oPath 中間不能有任何空白字元

  3. 只解壓縮特定檔案類型指定輸出目錄

    以下這個解壓縮命令會保留這些檔案的路徑在指定輸出目錄

    7z x "dir1.zip" -o"dir1" -r "*.dll"
    

    注意:7-Zip 並非使用 Windows 的 system wildcard parser,他並不會真的去比對有沒有這些系統檔案,而是傳入字串到 7z 命令中,讓 7-Zip 去比對所有檔案!

  4. 擷取特定檔案類型指定輸出目錄

    這裡不說「解壓縮」而說「擷取」是因為 7-Zip 有個參數 e 就是 Extract (擷取) 的意思。這個參數最大的特點就是【取出的檔案不會保留壓縮檔中的目錄結構】,專門用來讓你取出壓縮檔案中的一個或多個檔案。

    以下這個擷取命令會取出所有 *.js 檔案指定輸出目錄

    7z e "dir1.zip" -o"dir1" -r "*.js"
    

    如果壓縮檔中檔案很多,很有可能會遇到存在於不同目錄,但是檔名相同的狀況,此時就會出現檔名衝突問你要不要覆蓋的提示。如果不想提示直接覆蓋,可以加上 -y 參數:

    7z e "dir1.zip" -o"dir1" -r "*.dll" -y
    
  5. 解壓縮時略過壓縮檔中的第一層目錄指定輸出目錄

    7-Zip 不像 tar--strip-components= 這種強大的進階用法,所以使用上比較沒那麼靈活,需要搭配批次檔進行實作!

    如果是 PowerShell 的話,可以直接這樣執行:

    7z x .\MyWebsite.zip
    cd "MyWebsite"
    mv "*" "C:\Inetpub\wwwroot"
    cd ..
    rmdir "MyWebSite"
    

    如果是 Command Prompt 的話,建議安裝 Chocolatey 上有個 UnxUtils 套件,裡面有超多好用的 Linux 常見命令的 Windows 版本,其中當然包含了 mv 命令!

    choco install unxutils -y
    

其他 7-Zip 進階用法

  1. 壓縮檔案時包含解壓縮密碼

    壓縮的時候設定一個密碼(-p),解壓縮檔案的時候必須輸入!

    7z a "dir1.zip" "dir1/" -p"1q2w3e4r"
    

    壓縮的時候設定一個密碼(-p),並且將壓縮檔的 Header 資訊一併加密,也就是連檔名都一起加密,開啟壓縮檔的時候就要先輸入密碼才知道內容!(僅支援 *.7z 壓縮檔格式)

    7z a "dir1.7z" "dir1/" -p"1q2w3e4r"  -mhe
    

    解壓縮一個加密過的壓縮檔到指定輸出目錄

    7z x "dir1.7z" -o"dir1/" -p"1q2w3e4r"
    
  2. 列出所有檔案清單

    我們在自動化的過程中可能會需要先知道壓縮檔中有什麼檔案,此時可以利用 7zl (List) 命令達成這個目的。

    7z l "dir1.zip"
    
  3. 顯示壓縮檔中完整的技術資訊

    你可以從中看出每個檔案的完整資訊,包含 CRC 與各種檔案屬性的細節,非常 Geek 的內容

    7z l "dir1.zip" -slt
    
  4. 連同壓縮 NTFS 的 alternate streams 資訊到壓縮檔中 (-sns)

    我在 2008 年有介紹過這個東西 ▶ 介紹好用工具:Streams 讓你瞭解神秘的 NTFS 檔案系統

    壓縮檔案時包含 NTFS Alternate Streams

    7z a a.wim -sns *.txt
    

    7-Zip 解壓縮的時候預設就會包含 NTFS Alternate Streams 到檔案中

    7z x a.wim
    

    不想讓 7-Zip 解壓縮的時候包含 NTFS Alternate Streams 可以加上 -sns 參數

    7z x a.wim -sns-
    

    列出壓縮檔案內容時包含 NTFS Alternate Streams 資訊 (加上 -sns 參數)

    7z l a.wim -sns
    

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK