如何找出并打包文件成tar包
Q:我想找出所有的 *.doc 文件并將它們創建成一個 tar 包,然后存儲在 /nfs/backups/docs/file.tar
中。是否可以在 Linux 或者類 Unix 系統上查找并 tar 打包文件?
find
命令用于按照給定條件在目錄層次結構中搜索文件。tar
命令是用于 Linux 和類 Unix 系統創建 tar 包的歸檔工具。
How to find and tar files on linux unix
讓我們看看如何將 tar
命令與 find
命令結合在一個命令行中創建一個 tar 包。
Find 命令
語法是:
find /path/to/search -name "file-to-search" -options
## 找出所有 Perl(*.pl)文件 ##
find $HOME -name "*.pl" -print
## 找出所有 *.doc 文件 ##
find $HOME -name "*.doc" -print
## 找出所有 *.sh(shell 腳本)并運行 ls -l 命令 ##
find . -iname "*.sh" -exec ls -l {} +
***一個命令的輸出示例:
-rw-r--r-- 1 vivek vivek 1169 Apr 4 2017 ./backups/ansible/cluster/nginx.build.sh
-rwxr-xr-x 1 vivek vivek 1500 Dec 6 14:36 ./bin/cloudflare.pure.url.sh
lrwxrwxrwx 1 vivek vivek 13 Dec 31 2013 ./bin/cmspostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek 12 Dec 31 2013 ./bin/cmspreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek 14 Dec 31 2013 ./bin/cmssuploadimage.sh -> uploadimage.sh
lrwxrwxrwx 1 vivek vivek 13 Dec 31 2013 ./bin/faqpostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek 12 Dec 31 2013 ./bin/faqpreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek 14 Dec 31 2013 ./bin/faquploadimage.sh -> uploadimage.sh
-rw-r--r-- 1 vivek vivek 778 Nov 6 14:44 ./bin/mirror.sh
-rwxr-xr-x 1 vivek vivek 136 Apr 25 2015 ./bin/nixcraft.com.301.sh
-rwxr-xr-x 1 vivek vivek 547 Jan 30 2017 ./bin/paypal.sh
-rwxr-xr-x 1 vivek vivek 531 Dec 31 2013 ./bin/postupload.sh
-rwxr-xr-x 1 vivek vivek 437 Dec 31 2013 ./bin/preupload.sh
-rwxr-xr-x 1 vivek vivek 1046 May 18 2017 ./bin/purge.all.cloudflare.domain.sh
lrwxrwxrwx 1 vivek vivek 13 Dec 31 2013 ./bin/tipspostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek 12 Dec 31 2013 ./bin/tipspreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek 14 Dec 31 2013 ./bin/tipsuploadimage.sh -> uploadimage.sh
-rwxr-xr-x 1 vivek vivek 1193 Oct 18 2013 ./bin/uploadimage.sh
-rwxr-xr-x 1 vivek vivek 29 Nov 6 14:33 ./.vim/plugged/neomake/tests/fixtures/errors.sh
-rwxr-xr-x 1 vivek vivek 215 Nov 6 14:33 ./.vim/plugged/neomake/tests/helpers/trap.sh
Tar 命令
要創建 /home/vivek/projects 目錄的 tar 包,運行:
$ tar -cvf /home/vivek/projects.tar /home/vivek/projects
結合 find 和 tar 命令
語法是:
find /dir/to/search/ -name "*.doc" -exec tar -rvf out.tar {} \;
或者
find /dir/to/search/ -name "*.doc" -exec tar -rvf out.tar {} +
例子:
find $HOME -name "*.doc" -exec tar -rvf /tmp/all-doc-files.tar "{}" \;
或者
find $HOME -name "*.doc" -exec tar -rvf /tmp/all-doc-files.tar "{}" +
這里,find 命令的選項:
-name "*.doc"
:按照給定的模式/標準查找文件。在這里,在 $HOME 中查找所有 *.doc 文件。-exec tar ...
:對find
命令找到的所有文件執行tar
命令。
這里,tar
命令的選項:
-r
:將文件追加到歸檔末尾。參數與-c
選項具有相同的含義。-v
:詳細輸出。-f out.tar
: 將所有文件追加到 out.tar 中。
也可以像下面這樣將 find
命令的輸出通過管道輸入到 tar
命令中:
find $HOME -name "*.doc" -print0 | tar -cvf /tmp/file.tar --null -T -
傳遞給 find
命令的 -print0
選項處理特殊的文件名。--null
和 -T
選項告訴 tar
命令從標準輸入/管道讀取輸入。也可以使用 xargs
命令:
find $HOME -type f -name "*.sh" | xargs tar cfvz /nfs/x230/my-shell-scripts.tgz
有關更多信息,請參閱下面的 man 頁面:
$ man tar
$ man find
$ man xargs
$ man bash
作者簡介:
作者是 nixCraft 的創造者,是一名經驗豐富的系統管理員,也是 Linux 操作系統/Unix shell 腳本培訓師。他曾與全球客戶以及 IT、教育、國防和太空研究以及非營利部門等多個行業合作。在 Twitter、Facebook 和 Google+ 上關注他。