-Rを使ってドットファイルを正しくgrepしますか?

-Rを使ってドットファイルを正しくgrepしますか?

時々、どのパッケージが原因であるか(例:xfce4またはthunar?)、その命名規則が何であるか(.app対.application対.some_old_name対.config / app)、それを見つけるのではなく、不明なドットファイルで犯人を見つける必要がありますする時があります。 ...)、私は速くて汚い方法が欲しい。

me@here:~$ grep -IR .* -e culprit

しかし、この迅速で汚い方法は愚かな方法でもあります。数分後、これも私たちがここにいることを意味することに気づきました.*..時々、より遅くて汚れた変形を使用することもあります。

me@here:~$ grep -IR /home/me -e culprit

これは信じられないほど愚かな仕事であることが判明しました。特にmount自分自身のための巨大な、または遠い目標があるとき、さらにそうです$HOME。残念ながら、迅速でクリーンで正しい方法が見つかりません。 (頭がどんどん疲れています。)

ワイルドカード拡張でこれを達成できますか?つまり、バリアントが.*一致しません..(そして../.....)?

答え1

Linuxを使用している場合は試してみてください。

grep -IR --exclude-dir=".." culprit .*

シェルワイルドカードについて質問した後、私が最初に考えたのは.[!.]* ..[!.]*次のとおりです。

grep -IR culprit .[!.]* ..[!.]*

grep.で始まるファイルがない場合は、エラー終了が発生します..。この問題を解決するには、以下を追加して不足しているファイルを無視するように指示でき-sますgrep

grep -IRs culprit .[!.]* ..[!.]*

または、次に始まるファイルがない場合は、bashオプションzsh nullglobを使用して空のファイルに展開します。..[!.]*..

shopt -s nullglob   # for bash
setopt nullglob     # for zsh

grep -IR culprit .[!.]* ..[!.]*

上記のすべての方法が失敗した場合は、常にfind

find . -path "./.*" -exec grep culprit {} +

答え2

bashが利用可能な場合は、extglobドットファイルのみをインポートするために使用できます。

shopt -s extglob
grep -IR 'foo' .!(|.)

!拡張されたglobの演算子は「not」です。このパターンは、およびを除いてドット'.'で始まるすべての項目と一致します'..'

答え3

ありがとうイウィキ、次の変数があることがわかりましたGLOBIGNORE

Bash変数(shoptではない)GLOBIGNOREを使用すると、globが一致しないようにするパターンを指定できます。これにより、悪名高い「すべてのドットファイルを一致させたいのですが…または..は一致しません」の問題を解決できます。

$ echo .*
. .. .bash_history .bash_logout .bashrc .inputrc .vimrc
$ GLOBIGNORE=.:..
$ echo .*
.bash_history .bash_logout .bashrc .inputrc .vimrc

良いことは、副作用がほとんどないことです。考える..合計に合わせて? )、したがってfrom.も許可されており、手動操作の場合は、Qの最初の例に示すように、以前のglobを使用できます。export GLOBIGNORE=.:...bashrc.*

me@here:~$ set | grep GLOBIGNORE
GLOBIGNORE=.:.
me@here:~$ grep -IR .* -e culprit
.some-app/config: set culprit=1
me@here:~$

答え4

grep -IR culprit .[!.]*

.[!.]*で始まるすべてのドットファイルと一致します..。ドットファイルはで始まらないので..問題ありません。

.あるいは、決して含まれていないか、..globに含まれていないzshを使用することもできます。

grep -IR culprit .*

さらに難解に言えば、bashでは、このオプションはそのextglobオプションがオンの場合(shopt -s extglob)動作し、次のものを含みます..?*(ksh以降のzshでも機能しますsetopt ksh_glob)。

grep -IR culprit !(|.)

関連情報