Linux命令之tar


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM