「shopt -s dotglob」を使用する代わりに、名前がドット(ピリオド)で始まるディレクトリを「明示的に」一致させるBashパターンはありますか?

「shopt -s dotglob」を使用する代わりに、名前がドット(ピリオド)で始まるディレクトリを「明示的に」一致させるBashパターンはありますか?

ファイル名と一致するパターンを設定するときに、その文字を「明示的に」(つまり使用せずに)一致させるには/home/user/project/.gitどうすればよいですか?.shopt -s dotglob

マニュアルは次の場所にあります。https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html状態:

ファイル名拡張にパターンを使用する場合、シェルオプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後の「.」文字は明示的に一致する必要があります。

「明確なマッチング」とは正確に何を意味しますか?

繰り返しますが、http://www.tldp.org/LDP/abs/html/globbingref.htmlNotes最後の部分で)同じ概念を解決します。

ファイル名拡張はドットファイルと一致しますが、パターンにドットがリテラル文字として明示的に含まれている場合にのみ可能です。

この注意は次の例を提供します。

~/[.]bashrc    #  Will not expand to ~/.bashrc
~/?bashrc      #  Neither will this.
               #  Wild cards and metacharacters will NOT
               #+ expand to a dot in globbing.

~/.[b]ashrc    #  Will expand to ~/.bashrc
~/.ba?hrc      #  Likewise.
~/.bashr*      #  Likewise.

「ドットファイル」を含むように拡張された最後の3つの例の内部動作は理解できません。

b具体的には、例の中の括弧内に「明示的な」一致を作成するにはどうすればよいですか?次の例は私にとってもっと曖昧です。文字とまったく関係のないように見える方法でパターンを操作すると、パターンが一致する結果を得ることができることを理解できません。.~/.[b]ashrc.

私がなぜそれを避けたいのかについてのこの質問の原動力は、shopt -s dotglob私が他のプログラムの設定ファイルで使用するためにこれらのパターンを書いているという事実に由来します。 「隠しディレクトリ」などを含むパスを除外したいのですが、どのような方法でそれを指定.gitできるのかわかりません。dotglob

.本質的に:「明示的」で文字を一致させる最も簡単な方法は何ですか?次の文字を括弧内に入れると「動作するようになります」。しかし、このアプローチでは、「暗闇の中で撮影」しているように感じる理由を知りたいです。

これに関して、潜在的な行動の説明をいただきありがとうございます。

以下を追加するように編集されました。

最初は関連性がないようですが、人々は私のユースケースの具体的な詳細に興味を持っているようで、さらに説明します。

私はホストベースの侵入検知ソフトウェアを使用していますSamhain。 Samhainは、特定のカスタム設定パラメータに従ってファイルシステムが変更されるたびに「警告」します。

いいえ.gitディレクトリ内のファイル(一部の親ディレクトリにあります)が作成/修正/削除されたときにSamhainに警告するようにします。 Samhainでは、「ルールを無視する」を定義して、このタイプの除外を実行します。これらの規則の具体的な仕様は、次のトピックで説明されています。http://www.la-samhna.de/samhain/manual/filedef.html、存在する4.2. File/directory specification

簡単に言うと:

Wildcard patterns ('*', '?', '[...]') as in shell globbing are supported for paths. The leading '/' is mandatory.

そのため、関連ディレクトリと一致する「無視ルール」を作成しようとしましたが、.gitこれにより実際にSamhainはそのディレクトリを監視アクティビティから除外するようになりました。

最初は次のように試しました。

[IgnoreAll]
dir = -1/home/user/project/*/*/.git

これはうまくいきません。 Samhainは、これらのディレクトリのファイルが変更されるたびに警告し続けます.git

上記で引用した例を見つけて、次のことを試しました。

dir = -1/home/user/project/*/*/.[g]it

この変更により、Samhainは必要に応じてこれらのファイルを無視します。

この質問を投稿するとき、なぜこの変更が望ましい効果を得たのか理解したかったのです。

もともと使用しようとしたパターンが「echo」でテストされたときに問題のディレクトリと一致したことを考慮すると、あまり.git愚かではありません。

echo /home/user/project/*/*/.git

したがって、私はBashのパターンマッチング、ワイルドカード、またはファイル名拡張に関する基本的な知識を誤解していません。代わりに、この場合、Samhainがパターンマッチングを実装する方法に微妙な違いがあるようです。

Samhainのプロフィールに適用したとき、これがなぜ機能しないのかわかりません(明らかに)。この編集内容を見ると、誰かが説明できるはずです。

ベストアンサー1

ファイル名拡張にパターンを使用する場合、シェルオプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後の「.」文字は明示的に一致する必要があります。

これは単にglobを意味し、ファイル名の先頭のaと一致しませ*ん。ファイル名の先頭にaを一致させるにはglobを使用できず、明示的に入力する必要があります。たとえば、?[...]...

$ echo ????
Work
$ echo .???
.gem .pki .ssh .vim

そして他の質問に答えるには:

b具体的には、例の中の括弧内に「明示的な」一致を作成するにはどうすればよいですか?.~/.[b]ashrc

globモードを使用しても必ずしもそうではありません。みんなパターンはもはや「明確」ではありません。たとえば、~/.[b]ashrc文字は/.ashrc明示的に一致します。しかし、[b]これはグローバルパターンであり、明示的な一致ではありません。 (技術的には~チルダ拡張であり、グローバル拡張の前に行われるため、明示的な一致も同様です。)しかし.する明示的なマッチングはまさに~/.[b]ashrcマッチです~/.bashrc

~/?[b]ashrc比較のため、いいえmatch ~/.bashrc.もはや明示的な一致がないからです。

おすすめ記事