如何找出并打包文件成tar包
Q:我想找出所有的 *.doc 文件并將它們創(chuàng)建成一個(gè) tar 包,然后存儲(chǔ)在 /nfs/backups/docs/file.tar
中。是否可以在 Linux 或者類 Unix 系統(tǒng)上查找并 tar 打包文件?
find
命令用于按照給定條件在目錄層次結(jié)構(gòu)中搜索文件。tar
命令是用于 Linux 和類 Unix 系統(tǒng)創(chuàng)建 tar 包的歸檔工具。
How to find and tar files on linux unix
讓我們看看如何將 tar
命令與 find
命令結(jié)合在一個(gè)命令行中創(chuàng)建一個(gè) tar 包。
Find 命令
語(yǔ)法是:
find /path/to/search -name "file-to-search" -options
## 找出所有 Perl(*.pl)文件 ##
find $HOME -name "*.pl" -print
## 找出所有 *.doc 文件 ##
find $HOME -name "*.doc" -print
## 找出所有 *.sh(shell 腳本)并運(yùn)行 ls -l 命令 ##
find . -iname "*.sh" -exec ls -l {} +
***一個(gè)命令的輸出示例:
-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 命令
要創(chuàng)建 /home/vivek/projects 目錄的 tar 包,運(yùn)行:
$ tar -cvf /home/vivek/projects.tar /home/vivek/projects
結(jié)合 find 和 tar 命令
語(yǔ)法是:
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 命令的選項(xiàng):
-name "*.doc"
:按照給定的模式/標(biāo)準(zhǔn)查找文件。在這里,在 $HOME 中查找所有 *.doc 文件。-exec tar ...
:對(duì)find
命令找到的所有文件執(zhí)行tar
命令。
這里,tar
命令的選項(xiàng):
-r
:將文件追加到歸檔末尾。參數(shù)與-c
選項(xiàng)具有相同的含義。-v
:詳細(xì)輸出。-f out.tar
: 將所有文件追加到 out.tar 中。
也可以像下面這樣將 find
命令的輸出通過(guò)管道輸入到 tar
命令中:
find $HOME -name "*.doc" -print0 | tar -cvf /tmp/file.tar --null -T -
傳遞給 find
命令的 -print0
選項(xiàng)處理特殊的文件名。--null
和 -T
選項(xiàng)告訴 tar
命令從標(biāo)準(zhǔn)輸入/管道讀取輸入。也可以使用 xargs
命令:
find $HOME -type f -name "*.sh" | xargs tar cfvz /nfs/x230/my-shell-scripts.tgz
有關(guān)更多信息,請(qǐng)參閱下面的 man 頁(yè)面:
$ man tar
$ man find
$ man xargs
$ man bash
作者簡(jiǎn)介:
作者是 nixCraft 的創(chuàng)造者,是一名經(jīng)驗(yàn)豐富的系統(tǒng)管理員,也是 Linux 操作系統(tǒng)/Unix shell 腳本培訓(xùn)師。他曾與全球客戶以及 IT、教育、國(guó)防和太空研究以及非營(yíng)利部門等多個(gè)行業(yè)合作。在 Twitter、Facebook 和 Google+ 上關(guān)注他。