2009年2月21日 星期六

建立壓縮檔的script

假設目錄下有100個檔案,要建立多個壓縮檔,
通常之前要一個目錄一個目錄產生壓縮檔。

在windows下有bat,而在linux下有script都可以幫我們完成以下的任務

[Linux下]
comic.sh

#/bin/bash

for sitenu in $(seq -f '%03g' 1 100)
do
zip -r $sitenu.zip $sitenu
done

如此一來可以幫我們壓縮001.zip;002.zip-...-100.zip

[Windows下]
應該要透過7-zip的指令模式,有空再研究吧~
在這之前,為了要讓7z指令在每一個目錄下均可以使用,必需把在PATH中加入7-zip的資料夾。
在「我的電腦」按名鍵,選內容-進階-環境變數-系統變數-中的PATH在後面用分號分隔,再加入7-zip的執行檔位置,這樣在任何一個地方均可以執行7-zip啦~
7z.exe的命令語法如下:

7z 命令 [選項] 壓縮檔名 要處理的檔名列
命令:有a,d,e,l,t,u, x等幾個命令

aAdd將檔名列中的檔案加入壓縮檔-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-sfx (create SFX)
-si (use StdIn)
-so (use StdOut)
-t (Type of archive)
-u (Update)
-v (Volumes)
-w (Working Dir)
-x (Exclude)
dDelete將指定檔名由壓縮檔內移除

-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-u (Update)
-w (Working Dir)
-x (Exclude)

eExtract將指定檔名由壓縮檔中擷取出來

-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ai (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)

lList顯示壓縮檔案內的檔案資訊

-ai (Include archives)
-an (Disable parsing of archive_name)
-ai (Exclude archives)
-i (Include)
-p (Set Password)
-r (Recurse)
-x (Exclude)

tTest, 測試壓縮檔的完整性

-ai (Include archives)
-an (Disable parsing of archive_name)
-ai (Exclude archives)
-i (Include)
-p (Set Password)
-r (Recurse)
-x (Exclude)

uUpdate, 用較新的同名檔案更新壓縮檔內較舊的檔案

-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-sfx (create SFX)
-si (use StdIn)
-so (use StdOut)
-t (Type of archive)
-u (Update)
-w (Working Dir)
-x (Exclude)

xeXtract with full paths以完整路徑的格式解出檔案

-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ai (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)



範例:

* 壓縮檔案:
$ 7z a -tzip archive.zip test1.txt test2.txt test3.txt
* 刪除檔案:
$ 7z d archive.zip *.bak
* 解壓縮到目前資料夾:
$ 7z e archive.zip
* 解壓縮所有的.cpp檔案案件到指定資料夾:
$ 7z e archive.zip -oc:\soft *.cpp
* 顯示壓縮檔內的資訊:
$ 7z l archive.zip
* 依壓縮檔內的檔案路徑解壓縮到指定資料夾:
$ 7z x archive.zip -oc:\soft *.cpp

更詳細的內容直接看到7-zip.chm即可。

7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03

Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
[<@listfiles...>]

<Commands>
a: Add files to archive
b: Benchmark
d: Delete files from archive
e: Extract files from archive (without using directory names)
l: List contents of archive
t: Test integrity of archive
u: Update files to archive
x: eXtract files with full paths
<Switches>
-ai[r[-|0]]{@listfile|!wildcard}: Include archives
-ax[r[-|0]]{@listfile|!wildcard}: eXclude archives
-bd: Disable percentage indicator
-i[r[-|0]]{@listfile|!wildcard}: Include filenames
-m{Parameters}: set compression Method
-o{Directory}: set Output directory
-p{Password}: set Password
-r[-|0]: Recurse subdirectories
-scs{UTF-8 | WIN | DOS}: set charset for list files
-sfx[{name}]: Create SFX archive
-si[{name}]: read data from stdin
-slt: show technical information for l (List) command
-so: write data to stdout
-ssc[-]: set sensitive case mode
-ssw: compress shared files
-t{Type}: Set type of archive
-v{Size}[b|k|m|g]: Create volumes
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options
-w[{path}]: assign Work directory. Empty path means a temporary directory
-x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames
-y: assume Yes on all queries


[2009.08.05 補充]
若對指令不熟,可以直接到dos檔詢問,例如想要使用for指令,請使用以下指令
for /?

透過for壓縮1-69個資料夾到各別的zip檔案中
FOR /L %%a IN (1,1,69) DO 7z a "美味大挑戰 (%%a).zip" "美味大挑戰 (%%a)"

[2010.02.09 補充]
透過7z建立zip檔,並且排除eXclude這一個資料夾
% 7z a -tzip file.zip * -xr0!eXclude

參考資料:
[Tools] 7-Zip的命令列指令

沒有留言: