除外ファイルの構文がどのように解析されるかについてのドキュメントが見つからないようです。
つまり、ワイルドカードをサポートしていますか? 正規表現? ファイルとディレクトリをどのように区別しますか? パスプレフィックスは必要ですか? どこから(cwd /またはroot?)?
いくつかの例:
.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
こんにちは、見たことがありますか
パターンは内部でfilepath.Globを使用します。構文については、filepath.Matchを参照してください。 さらに、**は任意のサブディレクトリを除外します。 除外ファイルの環境変数は、os.ExpandEnvで展開されます。
https://github.com/restic/restic/blob/master/doc/manual.rst?
これはあなたの質問に答えるべきだと思います。
私はgolangのドキュメントを読みましたが、エンドユーザー(me!)は、エクスクルードを内部と比較しているリポジトリが何であるかを知らないと思います-それはフルパス(例:/ home / me / blah)ですか、それともからのパスですか?リポジトリルート(/ blahまたはblah)、またはcwd(/ homeにいるときのme / blah)に関連していますか?
この問題を提起していただきありがとうございます、私はあなたが有効なポイントを持っていると思います。 マニュアルでは、godoc.orgを参照せずに除外フィルターについて説明する必要があり、さらに多くの例が必要です。
すでにいくつかの質問に答えるには:
--exclude foo
は、 foo
という名前のファイルとディレクトリを除外します。 同じことが--exclude foo/
ます。除外ファイルから:
._*
は、名前がドットとアンダースコアで始まるすべてのファイルとディレクトリに一致しますdesktop.ini
は、 desktop.ini
と呼ばれるすべてのファイルと正確に一致します。 したがって、 desktop.ini.bak
は除外されず、スナップショットに保存されません。.Trash-*
は、 .Trash-
、 .Trash-foobar
などの名前のファイル/ディレクトリを除外します。.tmp$
は、文字通り.tmp$
という名前のすべてのファイル/ディレクトリを除外します。つまり、ドット、 tmp
、ドル記号が続きます。 正規表現の拡張はありません。~$
は、文字通りチルダドルという名前のすべてのファイル/ディレクトリを除外します。 チルダで終わるすべてのファイル/ディレクトリを除外するには、 *~
ます。~/.cache
は、チルダと呼ばれるすべてのディレクトリのディレクトリ.cache
を除外します。 ホームディレクトリのキャッシュディレクトリのみを除外するには、 $HOME/.cache
使用します(チルダは展開されません。環境変数は展開されますが、 --exclude-file
を介して読み取られたファイルでのみ、コマンドラインでシェルが展開されます。どちらも)。/full/path/to/directory/.syncthing/index*
は、 index
より下の/full/path/to/directory/.syncthing
index
始まる名前のすべてのものを除外します。ありがとう@ fd0
したがって、「現在のディレクトリ」とは、バックアップを起動したときにいたディレクトリを意味するのではなく、現在ファイルを調べているディレクトリを意味します(スラッシュで始まる除外を除く)。 とった。
ファイルとディレクトリの動作は少し予想外です。-excludefoo/はディレクトリをバックアップしますが、内容はバックアップしないと予想しましたが、-excludefooはどちらもバックアップしません。 理由はわかりませんが、rsyncから推測します。
私の例は重要なものを見逃しました:スペース! それらとシェルのメタ文字をバックスラッシュでエスケープする必要があると思います。
私はこれらのものをたくさんコピーすることになりました: https :
ああ、それはまだ完全には正しくないのではないかと思います。 resticが除外パターンを評価する方法について説明します。 次のように、resticがホームディレクトリ( /home/user
)のユーザーによって実行されていると仮定します。
$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~
次に、resticは次のコマンドライン引数を表示します(シェルによる拡張後)。
["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]
次に、 /home/user
トラバースを開始します。 次のリストは、指定されたファイル/ディレクトリが表示されたときに何が起こるかを示しています。 resticは常にパターンに対して完全なパスをテストします。
/home/user/foo.bak
:パターン*.bak
一致し、ファイルは保存されません。 このパターンは絶対的なものではないため、 .bak
終わるすべてのファイルのすべての場所で一致します。/home/user/secret
:絶対パターン/home/user/secret
一致するため、dirは保存されず、トラバースされません/home/user/foo/home/user/secret
:パターンが一致しないため、dirが保存されます。/home/user/work/extra
:パターンextra
一致し、dirは保存されません。これがもう少し明確になることを願っています。プロセスを説明するセクションをマニュアルに追加します。 重要なポイントは、バックアップ中にファイルのフルパスに対してパターンが評価されることです。 したがって、単一のディレクトリに一致させる場合は、完全なパスを使用してください。一致しない場合は、どこかで数回一致する可能性があります。
他に質問はありますか? :)
さらに質問がありますが、お時間を割いてお答えいただき、誠にありがとうございます。 これは、パターンの自動マジックアンカーについての1つの質問です。 私は答えを推測できると思います(私たちは絶対パスがかなりユニークであり、私たちが望む振る舞いを与えることに依存しています)が、尋ねて確認するのが最善です。
絶対パターン/home/user/secret
/home/user/secret2
一致しますか? (あなたがそれを望まない場合はどうなりますか?)
絶対パターン/home/user/secret
/home/user/somemount/home/user/secret
一致しますか?
どちらの場合も:いいえ、パターンは一致しません。
何故ですか? 編集:私はそれがないことを嬉しく思います、しかし私はそれがなぜであるかわかりません:)
そこにある一致するコードは、シェルが行うことをモデルにしています。自分自身に問いかけると、ファイル/home/user/secret2
が存在する場合、 ls /home/user/secret
は何を出力しますか(ファイルsecret
存在しません)?
より正式な用語で:パターンが/
で始まる場合、それは絶対的であり、パターンはテスト対象の文字列の先頭で一致する必要があるため、パターン/home/user/secret
は/home/user/somemount[...]
一致しません。
パターンとファイルパスの両方がそれぞれのコンポーネントに分割されていることを想像してみてください。
/home/user/secret
は[ROOT, "home", "user", "secret"]
分割され、ファイル/home/user/somemount/home/user/secret
は[ROOT, "home", "user", "somemount", "home", "user", "secret"]
分割されます。 この例では、文字列ROOT
を使用してルートディレクトリをマークしています。 パターンがファイル名に含まれていないことがわかります。[ROOT, "home", "user", "secret2"]
分割されているファイル/home/user/secret2
見てみましょう。 ここでも、パターンがファイル名に含まれていないことがわかります。[ROOT, "home", "user", "secret", "secret.txt"]
分割されたファイル/home/user/secret/secret.txt
場合、パターンが実際にファイル名の最初の[ROOT, "home", "user", "secret", ...]
に含まれていることがわかります。したがって、パターンは一致します。ファイルは除外されます。["secret", "secret.txt"]
分割されたsecret/secret.txt
相対除外パターンがあるとします。 このパターンは、ファイル/home/user/secret/secret.txt
のリストで、オフセット3: [ROOT, "home", "user", "secret", "secret.txt"]
から始まるので、パターンが一致していることがわかります。パスコンポーネントにワイルドカード( *
、 ?
など)がある場合、それらもテストされます。 したがって、最初の例では、 /home/user/secret*
パターンはパス/home/user/secret2
と一致します。
これらの例はすべて、私が思うマニュアルに文書化する必要があります。
ガッチャ。 ありがとう。
負の除外は、可能性のあるala .gitignoreを除外しますか?
ネストされたディレクトリ.meteor / local / dbを除いて、.meteorという名前のディレクトリ内のすべてのコンテンツを除外したい場合、これを実行できますか?
/ etc / restic / excludes:
.meteor/
!.meteor/local/db
restic backup exclude-file=/etc/restic/excludes
いいえ、まだ実装されていません。
包含/除外の例の文書化は#396で追跡されています。ここで、この問題を閉じます。
@ fd0以下のjobs / / jobs / / builds / ** / archiveのようなパスを除外して、すべてのディレクトリからアーカイブディレクトリを除外しようとしています。 そして、私は除外する必要があるこのような複数のパスを持っています、可能であれば、ドキュメントでそのような種類の例を見つけることができないので、この種類に対処するための最良の方法を提案できますか?
最も参考になるコメント
すでにいくつかの質問に答えるには:
--exclude foo
は、foo
という名前のファイルとディレクトリを除外します。 同じことが--exclude foo/
ます。除外ファイルから:
._*
は、名前がドットとアンダースコアで始まるすべてのファイルとディレクトリに一致しますdesktop.ini
は、desktop.ini
と呼ばれるすべてのファイルと正確に一致します。 したがって、desktop.ini.bak
は除外されず、スナップショットに保存されません。.Trash-*
は、.Trash-
、.Trash-foobar
などの名前のファイル/ディレクトリを除外します。.tmp$
は、文字通り.tmp$
という名前のすべてのファイル/ディレクトリを除外します。つまり、ドット、tmp
、ドル記号が続きます。 正規表現の拡張はありません。~$
は、文字通りチルダドルという名前のすべてのファイル/ディレクトリを除外します。 チルダで終わるすべてのファイル/ディレクトリを除外するには、*~
ます。~/.cache
は、チルダと呼ばれるすべてのディレクトリのディレクトリ.cache
を除外します。 ホームディレクトリのキャッシュディレクトリのみを除外するには、$HOME/.cache
使用します(チルダは展開されません。環境変数は展開されますが、--exclude-file
を介して読み取られたファイルでのみ、コマンドラインでシェルが展開されます。どちらも)。/full/path/to/directory/.syncthing/index*
は、index
より下の/full/path/to/directory/.syncthing
index
始まる名前のすべてのものを除外します。