これは#226のフォローアップの問題です。 これまでは、バックアップと復元の除外パターンを指定することしかできませんでした。
カバーされていないユースケースがあります。たとえば、ユーザーがホームディレクトリを/home/user
にバックアップし、ディレクトリwork
Cソースファイル以外のものを除外したい場合があります。
私が考えていなかった他の用途はありますか?
実装/ユーザーインターフェイス:コマンドラインで--include
と--exclude
両方のパターンを指定できるようにします。これにより、共通のリストが埋められます(ここでは順序が重要です)。 dir / fileごとに、リスト内のすべてのパターンを確認してください。 最後のマットパターンのアクション(除外または含める)が優先されます。 デフォルトのアクション(包含パターンも除外パターンも指定されていない場合にも使用されます)は「include」です。
これにはすでにコーナーケースが含まれています:resticは/home/user/work
を歩くべきですか?
すべきではないと思います。 代わりに、これが望ましい動作である場合は、除外されたディレクトリもウォークする必要があることを通知するために、より具体的なパターンを追加するようにユーザーに要求します(例: restic backup --exclude /home/user/work --include /home/user/work/**/*c. /home/user
。
より良いユーザーインターフェイスは、パターンを読み取るファイルを指定できるようにすることです( --pattern-file
など)。 このファイルでは、 #
始まるすべての行はコメントであり、空の行は無視されます。他のすべての行は、スペースの後に+
(含める)または-
(除外)で始まる必要があります。文字とパターン。 上記のユースケースの場合、フィルターファイルは次のようになります。
# filter out everything from work, but include c source code files
- /home/user/work
+ /home/user/work/**/*.c
この問題は、包含パターンと除外パターンの両方を持つための決定的なソリューションが実装されたら解決できます。
別の可能性は、ファイルから(またはstdinから)バックアップするファイルの正確なリストを読み取ることです。 そうすれば、人々は好きなツール(find、grepなど)を使用してリストを作成し、そのリストを「パイプ」して制限することができます。
返信を投稿する前に全文を読む必要があります。 ごめん。
これは別の問題であり、コマンドライン引数の代わりにstdinからバックアップするファイル/ディレクトリのリストを取得します。 それを持つことは価値があると思いますか? もしそうなら、あなたは問題を追加できますか?
私自身へのリマインダー:この問題はバックアップ用のフィルターを含めることに関するもので、復元にはすでにフィルターがあります。
rsyncの--exclude / -include / -exclude-from構文をコピーするだけでよいかもしれません、彼らは20年の経験があります:-)
(「/ foo」と「foo」が同じかどうか、または「* .c」がサポートされているかどうかが不明なため、少なくとも現在の構文の例をユーザーガイドに追加してください。
ああ、コメントをありがとう、私はマニュアルに欠けている例の問題を追加しました: https :
正直なところ、ルールが複雑すぎるため、rsyncのフィルター構文はまったく好きではありません。 しかし、私たちは何を思いつくことができるかを見るでしょう。
更新はありますか? それは間違いなく必須のオプションです。 現在、stdinからバックアップするためにファイルリストを読み取ることさえできません。
$ find -name '*.go' | restic backup --files-from -
open -: no such file or directory
一方、それは次のように書くことができます
restic backup --exclude '*' --include '*.go'
ええと、stdinからファイルのリストを読み取るには、次のようにresticを呼び出します。
$ find -name '*.go' | restic backup --files-from /dev/stdin
よろしければ、 --files-from
処理-
を追加するPRを受け入れます。 :)
@opennotaユースケースについて説明して
ダッシュ( -
)の問題は#769として追跡されます。
@ fd0
ユースケースはあまりありません。 リストに一時ファイルを使用せずに、特定の拡張子を持つファイルのみをバックアップしたいだけです。
よろしければ、-files-fromの処理を追加するPRを受け入れます。 :)
何ができるか見ていきます。
sed
と名前付きパイプを使用して、この動作をエミュレートできます。
restic --exclude-file <(sed -n 's/^- \(.*\)/\1/p' files.list) --files-from <(sed -n 's/^+ \(.*\)/\1/p' files.list)
-
始まる行は除外され、 +
始まる行が含まれます。
良いモデルは、borgが最近--patternと--patterns-fromに実装したものだと思います
https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg -help-patterns
さまざまなスタイルセレクターはそれほど多くありませんが、ルートパスを指定するオプション、ルールを含める、ルールを除外する、およびファイル内の再帰なしの除外ルール。
.gitignore
が使用する標準の無視形式を使用しないのはなぜですか? 例えば。
# ignore everything
*
# include $HOME/.local
!$HOME/.local
--includeは実装される予定ですか?
--includeと--excludeのように聞こえますが、一緒に実装することはできません。少なくとも、優先順位の階層になります。
--files-from
でファイルのリストを提供しても、 snapshots
サブコマンドはファイルの巨大なリストを表示し、 forget
サブコマンドは期待どおりに機能しないため、問題を完全に解決することはできません。
私のユースケースは私の家をバックアップすることであり、いくつかの除外と除外のいくつかの例外を含むパスのリストがあります。 パスの基本リストには、すでに100個のアイテムが含まれています。 すべてが$HOME
未満なので、 --exclude=** --include=~/path1 --include=~/path2 --exclude=~/path2/something --exclude=*~
ようなことを言うことができると思います。 したがって、パスを含める必要があるかどうかを判断するには、パスを各--exclude
および--include
と正しい順序で照合し、最後に一致したものが優先されます。
@vincentbernatのPRは、この要件に対する効果的な解決策だと思います。
_概要:gitignoreスタイルのネガティブパターンで、バックアップと復元の両方の除外ルールを指定できるようにします。_
私はそれを数週間効果的に使用しています。
特に、これにより、以前は非常に冗長だったスナップショットのリストを簡略化できます。
b951f6a2 2019-06-15 11:30:18 elvandar manual /Users/daniel/Desktop
/Users/daniel/Documents
<lots more...>
に:
d0c0bed1 2019-06-18 08:20:57 elvandar /Users/daniel
また、この機能を使用して継続的なバックアップを提供する効果的な(完全ではありませんが機能する)ソリューションを実装しました(詳細はまもなく共有します)。
最も参考になるコメント
.gitignore
が使用する標準の無視形式を使用しないのはなぜですか? 例えば。