때로는 어떤 패키지가 원인인지(예: 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 !(|.)