一部のファイル/ディレクトリを除外するために、 "--exclude-from"でtarコマンドを使用するDebian 8システムにバックアップスクリプトを作成しました。
/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
# ...
除外ファイルです。
/etc/php5/fpm
/etc/nginx
/etc/mysql
/home/me/websites/*log.txt
/home/me/websites/**/vendor
目的は、「Webサイト」ディレクトリにあるすべてのログファイルと、「Webサイト」のサブディレクトリにあるすべての「ベンダー」ディレクトリを除外することです。
ベストアンサー1
シェルは引数でワイルドカード文字を拡張するため、ほとんどのアプリケーションではワイルドカード拡張を実行する必要はありません。ただし、tarの除外リストはする既存のシェルでサポートされているものと正確に一致するワイルドカードがサポートされています。微妙な違いがあるかもしれません。たとえば、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
ファイル名が必要です。ファイルには1行に1つのパターンを含める必要があります。--exclude
(次にパターンがオーム)と--exclude-from
(次にパターンを含むファイル名がオーム)を混同しないでください。