tar [選項] [文件]
tar將多個文件保存到單個磁帶或磁盤存檔中,並可以從存檔中恢復單個文件。
這里涉及到了歸檔和壓縮,簡單的來說,歸檔是將多個文件或文件夾打包成一個包文件(即存檔);壓縮是將文件通過特定算法減小文件大小的機制。在tar生成的包中以".tar"結尾文件是歸檔文件(即存檔),以".tar.xx"結尾的文件是壓縮包。
(1).選項
主操作模式(以下參數至少一個才可運行):
-A,--catenate,--concatenate 追加tar文件至存檔 -c,--create 創建一個新存檔 -d,--diff,--compare 找出存檔和文件系統的差異 --delete 從存檔中刪除 -r,--append 追加文件至存檔結尾 -t,--list 列出存檔內容 --test-label 測試存檔卷標並退出 -u,--update 僅追加比存檔中副本新的文件 -x,--extract,--get 提取,從存檔中解壓還原文件
常用的選項(用到比較多的選項,之后的選項可能會重復):
-C,--directory=DIR 切換目錄到DIR(一般用於指定解壓位置) -f,--file=ARCHIVE 使用存檔文件或ARCHIVE設備 -j,--bzip2 通過bzip2過濾存檔 -J,--xz 通過xz過濾存檔 -p,--preserve-permissions 提取有關文件權限的信息(超級用戶默認選項) -v,--verbose 詳細列出已處理的文件 -z,--gzip 通過gzip過濾存檔
操作修飾符:
--check-device 創建增量存檔時,檢測設備編號(默認) --no-check-device 創建增量存檔時不要檢查設備編號 -g,--listed-incremental=FILE 處理新的GNU格式增量備份 -G,--incremental 處理舊的GNU格式增量備份 --ignore-failed-read 當遇到不可讀文件時不要以非零值退出 --level-NUMBER 已創建的增量列表存檔的輸出級別 -n,--seek 存檔是可以檢索的 --no-seek 存檔是不可檢索的 --occurrence[=NUMBER] 僅處理存檔中每個文件的第NUMBER個事件;此選項僅在與命令--delete,--dif,--extract或--list中的一個連個使用時有效,並在命令行或通過-T選項提供文件列表。NUMBER默認為1。 --sparse-version=MAJOR[.MINOR] 設置要使用的離散格式的版本(隱含--sparse) -S,--sparse 高效處理離散文件
重寫控制:
-k,--keep-old-files 提取時不替換現有文件,將它們視為錯誤 --keep-newer-files (解壓/提取)不要替換比存檔中新的現有文件 --keep-directory-symlink 提取時不要將現有符號鏈接替換為目錄 --overwrite提取時重寫現有文件 --overwrite-dir 提取時重寫現有目錄的元數據 --no-overwrite-dir保留現有目錄的元文件 --recursive-unlink 在提取目錄之前清空目錄層次結構 --remove-files 將文件添加到存檔后刪除文件 --skip-old-files 提取時不要替換現有文件,以靜默方式跳過 -U,--unlink-first 在提取覆蓋之前刪除那個文件 -W,--verify 寫入后嘗試驗證存檔
選擇輸出流:
--ignore-command-error 忽略子進程的退出代碼 --no-ignore-command-error 將子進程的非零退出代碼視為錯誤 -O,--to-stdout 提取文件至標准輸出 --to-command=COMMAND 將提取的文件通過管道送至另一個程序
操作文件屬性:
--atime-preserve[=METHOD] 在輸出的文件上保留訪問時間,要么通過在讀取(默認METHOD=’repalce’)后還原時間,要不就不要在第一次(METHOD=’system’)設置時間 --delay-directory-restore 直到提取結束再設置提取目錄的修改時間和權限 --no-delay-directory-restore 取消--delay-directory-restore選項的效果 --group=NAME 強制將NAME添加為文件的組 --mode=CHANGES 強制將所添加的文件(符號)模式更改為權限CHANGES --mtime=DTAE-OR-FILE 從DATE-OR-FILE中為文件設置mtime -m,--touch 不提取文件的修改時間 --numeric-owner 始終使用數字作為用戶/組的名稱 --owner=NAME 強制NAME為添加文件的所有者 -p,--preserve-permissions,--same-permissions 提取有關文件權限的信息(超級用戶默認) --no-same-permissions 從存檔中提取權限時使用用戶的掩碼位 --preserve 與-p和-s一樣 --same-owner 嘗試提取時保持所有者關系一致(超級用戶默認) --no-same-owner 將文件解壓為您所有(普通用戶默認) -s,--preserve-order,--same-order 對要提取的名稱進行排序以匹配存檔
處理擴展文件屬性:
--acls 啟用POSIX ACLs支持 --no-acls 禁用POSIX ACLs支持 --selinux 啟用SELinux環境支持 --no-selinux 禁用SELinux 環境支持 --xattrs 啟用擴展屬性支持 --no-xattrs 禁用擴展屬性支持 --xattrs-exclude=MASK 指定擴展屬性排除的模式 --xattrs-include=MASK 指定擴展屬性包含的模式
設備選擇和切換:
-f,--file=ARCHIVE 使用存檔文件或設備ARCHIVE --force-local 存檔文件即使有冒號也是本地的 -F,--info-script=NAME,--new-volume-script=NAME 在每卷磁帶最后運行腳本(隱含-M) -L,--tape-length=NUMBER 寫入NUMBER*1024字節后更換磁帶 -M,--multi-volume 創建/列出/提取多卷存檔 --rmt-command=COMMAND 使用給定的rmt參數COMMAND取代rmt --rsh-command=COMMAND 使用遠程參數COMMAND取代rsh --volno-file=FILE 使用/更新FILE中的卷號
設備分塊:
-b,--blocking-factor=BLOCKS 每天圖片BLOCKS*512字節 -B,--read-full-records 讀取時重新分塊(只對4.2BSD管道有效) -i,--ignore-zeros 忽略存檔中的零字節塊(即文件結尾) --record-size=NUMBER 每條記錄NUMBER個字節,512的倍數
存檔格式選擇:
-H,--format=FORMAT 創建指定格式的存檔 FORMAT有以下格式: gnu GNU tar 1.13.x格式 oldgnu GNU格式,tar<=1.12 pax POSIX 1003.1-2001(pax)格式 posix 與pax相同 ustar POSIX 1003.1-1988(ustar)格式 v7 舊的v7 tar格式 --old-archive,--portability 與--format=v7相同 --pax-option=keyword[[:]=value][,keyword[[:]=value]]… 控制pax關鍵字 --posix 與--format=posix相同 -V,--label=TEXT 使用卷名TEXT創建存檔;在列出/提取時,使用TEXT作為卷名的通配模式。
壓縮選項:
-a,--auto-compress 使用存檔后綴來確定壓縮程序
--no-auto-compress 不使用存檔后綴來確定壓縮程序
-l,--use-compress-program=PROG 通過PROG過濾(必須能接受-d選項的程序)
-j,--bzip2 通過bzip過濾存檔
-J,--xz 通過xz過濾存檔
--lzip 通過lzip過濾存檔
--lzma 通過lzma過濾存檔
--lzop 通過lzop過濾存檔(?)
-z,--gzip,--gunzip,--ungzip 通過gzip過濾存檔
-Z,--compress,--uncompress 通過compress過濾存檔
注意:你可能需要安裝外部程序(lzip/ncompress/lzma…)才能使用其中一些壓縮選項
本地文件選擇:
--add-file=FILE 將給定的FILE添加到存檔(如果其命名以短划線開頭,則非常有用) --backup[=CONTROL] 在刪除前備份,選擇版本CONTROL -C,--directory=DIR 切換到目錄DIR --exclude=PATTERN 排除以PATTERN形式指定的文件 --exclude-backups 排除備份和鎖定文件 --exclude-caches 除標識文件本身外,排除包含CACHEDIR.TAG的目錄中的內容 --exclude-caches-all 排除包含CACHEDIR.TAG的目錄 --exclude-caches-under 排除包含CACHEDIR.TAG的目錄下所有內容 --exclude-tag=FILE 除FILE本身,排除包含FILE的目錄中的內容 --exclude-all=FILE 排除包含FILE的目錄 --exclude-tag-under=FILE 排除包含FILE的目錄下所有內容 --exclude-vcs 排除版本控制系統目錄 -h,--dereference 跟蹤符號鏈接;將它們所指向的文件存檔並輸出 --hard-dereference 跟蹤硬鏈接;將它們所指向的文件存檔並輸出 -K,--starting-file=MEMBER_NAME 從存檔中MEMBER_NAME成員處開始 --newer-mtime=DATE 只有當數據被更改時,比較數據和時間 --null -T讀取以空為結尾的名字,-C禁用 --no-null 禁用上一個--null選項效果 -N,--newer=DATE-OR-FILE,--after-date=DATE-OR-FILE 僅存儲比DATE-OR-FILE新的文件 --one-file-system 創建存檔時保留在本地文件系統中 -P,--absolute-names 不用從文件名中刪除引導符’/’ --recursion 遞歸目錄(默認) --no-recursion 避免目錄中的自動降級 --suffix=STRING 在刪除前備份,除非被環境變量SIMPLE_BACKUP_SUFFIX覆蓋,否則覆蓋常用后綴’~’ -T,--files-from=FILE 從FILE中獲取文件名來解壓或創建文件 --unquote 用-T讀取的文件名作為引用結尾(默認) --no-unquote 不用-T讀取的文件名作為引用結尾 -X,--exclude-from=FILE 排除FILE中列出的模式
文件名轉換:
--strip-components=NUMBER 在提取時從文件名中刪除NUMBER個引導部分 --transform=EXPRESSION,--xform=EXPRESSION 使用sed替換EXPRESSION來轉換文件名 文件名匹配選項(同時影響排除和包含模式): --anchored 模式匹配文件名頭部 --ignore-case 忽略大小寫 --no-anchored 模式匹配任意’/’后字符(默認對exclusion有效) --no-ignore-case 區分大小寫匹配(默認) --no-wildcards 逐字匹配字符串 --no-wildcards-match-slash 通配符不匹配’/’ --wildcards 使用通配符(默認) --wildcards-match-slash 使用通配符匹配’/’(默認為排序)
提示性輸出:
--checkpoint[=NUMBER] 每隔NUMBER個記錄顯示進度信息(默認為10) --checkpoint-action=ACTION 在每個檢查點上執行ACTION --full-time print file time to its full resolution(打印文件時間到其全分辨率?(全屏?)) --index-file=FILE 將詳細輸出發送到FILE -l,--check-links 只要不是所有鏈接都被輸出就打印信息 --no-quote-chars=STRING 禁用STRING中的字符引用 --quto-chars=STRING 加之STRING中的字符引用 --quoting-style=STYLE 設置名稱引用樣式;有效的STYLE值有literal、shell、shell-always、c、c-maybe、escape、locale、clocale -R,--block-number 每個信息都顯示存檔內的塊數 --show-defaults 顯示tar默認選項 --show-omitted-dirs 列出或解壓時,將與搜索條件不匹配的目錄列出 --show-transformed-names,--show-stored-names 轉換后顯示文件或存檔名稱 --totals[=SIGNAL] 處理存檔后打印出總字節數;當此SIGNAL被觸發時帶參數 - 打印總字節數;運行的信號為:SIGHUP,SIGQUIT,SIGINT,SIGUSR1和SIGSUR2;同時也接收不帶SIG前綴的信號名稱 --utc 以UTC(世界標准時間)格式打印文件修改日期 -v,--verbose 詳細列出已處理的文件 --warning=KEYWORD 警告控制 -w,--interactive,--confirmation每次操作都要求確認
兼容性選擇:
-o 創建存檔時相當於--old-archive;提取存檔時相當於--no-same-owner
其他選項:
-?,--help 顯示幫助列表 --restrict 禁用某些潛在的有危險的選項 --usage 顯示簡短的用法說明 --version 打印程序版本
除非以 --suffix 或 SIMPLE_BACKUP_SUFFIX設置備份后綴,否則備份后綴就是“~”。
可以用 --backup 或 VERSION_CONTROL 設置版本控制,可能的值為:
none, off 從不做備份
t, numbered 進行編號備份
nil, existing
如果編號備份存在則進行編號備份,否則進行簡單備份
never, simple 總是使用簡單備份
(2).實例
打包文件夾(歸檔)
[xf@xuexi ~]$ ls -l 總用量 0 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 公共 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 模板 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 視頻 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 圖片 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 文檔 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 下載 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 音樂 drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面 [xf@xuexi ~]$ mkdir newDir [xf@xuexi ~]$ touch newDir/{1.txt,2.txt,3.txt} [xf@xuexi ~]$ tar -cvf newDir.tar newDir/ newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ ls -l 總用量 12 drwxrwxr-x. 2 xf xf 45 11月 29 13:19 newDir -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar drwxr-xr-x. 2 xf xf 6 9月 6 11:43 公共 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 模板 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 視頻 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 圖片 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 文檔 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 下載 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 音樂 drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面 [root@xuexi ~]# tar -cvf grub.tar /boot/grub/ //也可以使用絕對路徑 tar: 從成員名中刪除開頭的“/” //如果不去除根,解壓時將會覆蓋/boot/grub目錄。去除根后將會在指定目錄下解壓出boot/grub/ /boot/grub/ /boot/grub/splash.xpm.gz
注意:使用絕對路徑歸檔文件時,將默認從路徑中刪除根,這樣解壓時會解壓到當前目錄。如果不移除根,解壓時按絕對路徑來釋放,會覆蓋原系統中此路徑的文件。
以gzip,bzip2和zx格式打包並壓縮文件夾
[xf@xuexi ~]$ tar -czvf newDir.tar.gz newDir newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ tar -cjvf newDir.tar.bz2 newDir newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ tar -cJvf newDir.tar.xz newDir newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ ls -l 總用量 24 drwxrwxr-x. 2 xf xf 45 11月 29 13:19 newDir -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar -rw-rw-r--. 1 xf xf 169 11月 29 13:24 newDir.tar.bz2 //bzip2格式的壓縮包 -rw-rw-r--. 1 xf xf 159 11月 29 13:24 newDir.tar.gz //gzip格式的壓縮包 -rw-rw-r--. 1 xf xf 196 11月 29 13:25 newDir.tar.xz //xz格式的壓縮包 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 公共 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 模板 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 視頻 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 圖片 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 文檔 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 下載 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 音樂 drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
列出上述歸檔/壓縮包包含的文件,用什么格式壓縮,就要用什么格式過濾
[xf@xuexi ~]$ tar -tvf newDir.tar drwxrwxr-x xf/xf 0 2018-11-29 13:19 newDir/ -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/1.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/2.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/3.txt [root@xuexi ~]# tar -tvf grub.tar drwxr-xr-x root/root 0 2018-12-09 15:33 boot/grub/ -rw-r--r-- root/root 1350 2011-11-16 05:03 boot/grub/splash.xpm.gz [xf@xuexi ~]$ tar -tvfj newDir.tar.bz2 //-f后面跟有參數 tar: j:無法 open: 沒有那個文件或目錄 tar: Error is not recoverable: exiting now [xf@xuexi ~]$ tar -tjvf newDir.tar.bz2 drwxrwxr-x xf/xf 0 2018-11-29 13:19 newDir/ -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/1.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/2.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/3.txt [xf@xuexi ~]$ tar -tJvf newDir.tar.xz drwxrwxr-x xf/xf 0 2018-11-29 13:19 newDir/ -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/1.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/2.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/3.txt [xf@xuexi ~]$ tar -tzvf newDir.tar.gz drwxrwxr-x xf/xf 0 2018-11-29 13:19 newDir/ -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/1.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/2.txt -rw-rw-r-- xf/xf 0 2018-11-29 13:19 newDir/3.txt
提取歸檔/壓縮包,一樣需要使用相同格式過濾
[xf@xuexi ~]$ rm newDir/1.txt //刪除文件夾下單獨一個文件 [xf@xuexi ~]$ tar -xzvf newDir.tar.gz newDir newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ ls -l newDir/ //1.txt又出現了 總用量 0 -rw-rw-r--. 1 xf xf 0 11月 29 13:19 1.txt -rw-rw-r--. 1 xf xf 0 11月 29 13:19 2.txt -rw-rw-r--. 1 xf xf 0 11月 29 13:19 3.txt [xf@xuexi ~]$ rm newDir/* [xf@xuexi ~]$ rmdir newDir/ //將整個newDir文件夾刪除 [xf@xuexi ~]$ tar -xjvf newDir.tar.bz2 newDir newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ ls -l 總用量 24 drwxrwxr-x. 2 xf xf 45 11月 29 13:19 newDir //提取壓縮包后又出現了 -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar -rw-rw-r--. 1 xf xf 169 11月 29 13:24 newDir.tar.bz2 -rw-rw-r--. 1 xf xf 159 11月 29 13:24 newDir.tar.gz -rw-rw-r--. 1 xf xf 196 11月 29 13:25 newDir.tar.xz drwxr-xr-x. 2 xf xf 6 9月 6 11:43 公共 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 模板 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 視頻 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 圖片 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 文檔 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 下載 drwxr-xr-x. 2 xf xf 6 9月 6 11:43 音樂 drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
//注意:文件夾名稱不能變
如果想要解壓到指定的文件夾下,又該如何
[xf@xuexi ~]$ mkdir newDir2 [xf@xuexi ~]$ tar -xJvf newDir.tar.xz newDir2 //直接操作會發現報錯 tar: newDir2:歸檔中找不到 tar: 由於前次錯誤,將以上次的錯誤狀態退出 [xf@xuexi ~]$ tar -xJvf newDir.tar.xz -C newDir2 //這時使用-C切換一下目錄,發現可以提取了 newDir/ newDir/1.txt newDir/2.txt newDir/3.txt [xf@xuexi ~]$ ls -l newDir2 總用量 0 drwxrwxr-x. 2 xf xf 45 11月 29 13:19 newDir [xf@xuexi ~]$ ls -l newDir2/newDir/ 總用量 0 -rw-rw-r--. 1 xf xf 0 11月 29 13:19 1.txt -rw-rw-r--. 1 xf xf 0 11月 29 13:19 2.txt -rw-rw-r--. 1 xf xf 0 11月 29 13:19 3.txt
如果只想提取其中一個或幾個文件,需要進行什么操作
[xf@xuexi ~]$ rm newDir/* [xf@xuexi ~]$ tar -zxvf newDir.tar.gz newDir/1.txt //如果多個文件則使用大括號“{}”包裹文件名,文件名之間用逗號“,”隔開 newDir/1.txt
打包(歸檔)時不包含指定目錄下的文件
[xf@xuexi ~]$ mkdir Dir [xf@xuexi ~]$ touch Dir/{t1,t2,t3} [xf@xuexi ~]$ tar --exclude Dir/t1 -zcvf Dir.test.tar.gz Dir Dir/ Dir/t2 Dir/t3 [xf@xuexi ~]$ tar -ztvf Dir.test.tar.gz drwxrwxr-x xf/xf 0 2018-11-29 15:26 Dir/ -rw-rw-r-- xf/xf 0 2018-11-29 15:26 Dir/t2 -rw-rw-r-- xf/xf 0 2018-11-29 15:26 Dir/t3 [xf@xuexi ~]$ tar --exclude ./Dir/t1 -zcvf Dir.test2.tar.gz Dir //加上'./'后反而無法生效 Dir/ Dir/t1 Dir/t2 Dir/t3 [xf@xuexi ~]$ tar -ztvf Dir.test2.tar.gz drwxrwxr-x xf/xf 0 2018-11-29 15:26 Dir/ -rw-rw-r-- xf/xf 0 2018-11-29 15:26 Dir/t1 -rw-rw-r-- xf/xf 0 2018-11-29 15:26 Dir/t2 -rw-rw-r-- xf/xf 0 2018-11-29 15:26 Dir/t3
打包多個不同的文件夾或文件
[root@xuexi ~]# tar -cvf back.tar /boot/grub CentOS-Base.repo /etc/passwd //可以看到,正常打包即可 tar: 從成員名中刪除開頭的“/” /boot/grub/ /boot/grub/splash.xpm.gz CentOS-Base.repo /etc/passwd
(3).擴展
壓縮比例越高,壓縮時間越長,壓縮文件越小。壓縮比例:xz>bz2>gz>tar。