-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 .[!.]* ..[!.]*

또는 다음으로 시작하는 파일이 없으면 bashzsh 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 !(|.)

관련 정보