tar ‘–exclude-from’ 雙星萬用字元
我在我的 Debian 8 系統上編寫了一個備份腳本,它使用帶有“–exclude-from”的 tar 命令來排除一些文件/目錄。
這很好用,但今天我想排除一些共享相同路徑模式的文件,
/home/www-data/sites/<some_string>log.txt
比如/home/www-data/sites/<one_or_two_directories>/vendor
.我試圖追加
/home/www-data/sites/*log.txt
到文件中,但 tar 失敗並在 stderr 上輸出以下錯誤:tar: /home/www-data/sites/*log.txt: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors
嘗試使用
*
or時我錯過了什麼**
嗎?然後我讀到,*在 Unix 中,程序通常不會自己解釋萬用字元,*這意味著tar
*
也不會擴展萬用字元**
。據我所知,我最後的手段是在呼叫之前使用 bash 擴展列表並將其附加到排除文件中(如果它不存在的話)
tar
。有沒有更清潔的方法?編輯
這是腳本片段..
# ... broot=$(dirname "${PWD}") i="${PWD}/list.include" x="${PWD}/list.exclude" o="$broot/archive.tgz" tar -zpcf $o -T $i -X $x # ...
Dans 這裡是排除文件..
/etc/php5/fpm /etc/nginx /etc/mysql /home/me/websites/*log.txt /home/me/websites/**/vendor
目標是排除位於“websites”目錄中的所有日誌文件,以及可以在“websites”的任何子目錄中找到的所有“vendor”目錄。
謝謝 !
shell 擴展參數中的萬用字元,因此大多數應用程序不需要執行任何萬用字元擴展。然而 tar 的排除列表確實支持萬用字元,它恰好與傳統 shell 支持的萬用字元匹配。請注意,可能存在細微差異;例如 tar 不區分
*
,而**
ksh、bash 和 zsh 可以。使用 tar,*
可以匹配任何字元,包括/
,例如排除在層次結構的任何級別*/.svn
呼叫的文件。.svn
您可以在不匹配目錄分隔符tar --no-wildcards-match-slash
的情況下使用。*
例如,排除
/home/me/websites/*log.txt
排除/home/me/websites/log.txt
和。排除排除和但不排除。使用選項,不排除和不排除。/home/me/websites/foo-log.txt``/home/me/websites/subdir/log.txt``/home/me/websites/**/vendor``/home/me/websites/one/vendor``/home/me/websites/one/two/vendor``/home/me/websites/vendor``--no-wildcards-match-slash``/home/me/websites/*log.txt``/home/me/websites/subdir/log.txt``/home/me/websites/**/vendor``/home/me/websites/one/two/vendor
tar … --exclude='/home/www-data/sites/*include' …
排除/home/www-data/sites
名稱以 . 結尾的文件和目錄include
。您可能會在沒有引號的情況下逃脫,但如果您編寫~~--exclude /home/www-data/sites/*include
~~(因為外殼會在tar
看到萬用字元之前擴展萬用字元)或者如果您使用的外殼會在不匹配的萬用字元上發出錯誤信號(例如預設情況下的 zsh - 和推薦——配置)。該選項
--exclude-from
需要一個文件名。該文件每行必須包含一個模式。不要混淆--exclude
(後跟模式)和--exclude-from
(後跟包含模式的文件的名稱)。