作者 | Vivek Gite
譯者 | geekpi
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 包[1],執行:
$ 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+ 上關註他。
via: https://www.cyberciti.biz/faq/linux-unix-find-tar-files-into-tarball-command/
作者:Vivek Gite[3] 譯者:geekpi 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出