Tar

tar ‘–exclude-from’ 雙星萬用字元

  • January 24, 2020

我在我的 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(後跟包含模式的文件的名稱)。

引用自:https://unix.stackexchange.com/questions/252516