내 grep 버전은 다음 grep (BSD grep) 2.5.1-FreeBSD
과 같습니다. 내 운영 체제는 다음과 같습니다.OSX 10.13.3 (17D47)
gitbook 저장소가 있고 _book
grep을 사용할 때 무시하고 싶은 임시 디렉토리가 있습니다.
내가 그것을 사용할 때 디렉토리 grep -Fnrl mysql ./ --exclude-dir={_book}
를 제외하지 않았습니다 _book
. 결과는 다음과 같습니다.
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh
.//_book/search_jieba_index.dat
.//_book/LANGUAGES/awk/awk_magic.html
하지만 이 명령은 grep -Fnrl mysql ./ --exclude-dir "_book"
내가 기대한 결과를 제공합니다. 결과는 다음과 같습니다.
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh
나는 stackoverflow를 검색하여 첫 번째 명령 스타일을 언급하고 3개의 찬성표를 얻은 질문을 찾았으므로 어떤 경우에는 작동할 것 같습니다.
질문 링크는 다음과 같습니다.여러 디렉터리를 제외하려면 --exclude-dir 플래그와 함께 grep을 사용하세요.
왜 이런 일이 발생합니까?
성공을 제외하기 위해 첫 번째 명령 방법을 사용하려면 어떻게 해야 합니까 _book
?
답변1
그 기사는 bash의 장점을 활용하고 있습니다.버팀대 확장:
$ printf "%s\n" --exclude-dir={a,b,c}
--exclude-dir=a
--exclude-dir=b
--exclude-dir=c
그러나 요소가 하나만 있는 경우 중괄호 확장이 적용되지 않고 중괄호는 그대로 유지됩니다.
$ printf "%s\n" --exclude-dir={a}
--exclude-dir={a}
중괄호 확장은 grep이 아닌 bash(및 일부 다른 쉘)의 기능이므로 grep에서는 이름이 지정된 이름을 제외하도록 지시하는 것처럼 보입니다 {_book}
.
답변2
이것은 다른 "명령 스타일"이 아닙니다. 그들은 다음을 이용하고 있습니다.세게 때리다특징이 아니라 grep
특성입니다.
다음 명령을 실행하여 읽으십시오.
LESS='+/Brace Expansion' man bash
중괄호 안에 쉼표로 구분된 값이 있는 경우껍데기grep
보기 전에 여러 매개변수로 확장하세요.
디렉토리만 전달하므로 중괄호 확장이 필요하지 않습니다.
항목 사이에 항목이 하나만 있는 중괄호를 사용하는 경우(범위를 나타내는 쉼표와 이중 마침표 없음) 쉘은 중괄호를 그대로 둡니다. grep
리터럴 name 을 전달해야 합니다 {_book}
. 이는 제외하려는 디렉터리가 아닙니다.
큰따옴표도 필요하지 않다는 점을 언급할 가치가 있습니다.
grep -Fnrl mysql ./ --exclude-dir _book
...잘 작동할 거예요.
큰따옴표는 해를 끼치지 않지만 필수는 아닙니다. 당신은 그들을 사용할 수 있습니다모두grep
매개변수는 쉘이 보기 전에 따옴표가 제거되므로 동일한 결과를 갖습니다 .
grep '-Fnrl' "mysql" './' "--exclude-dir" \_\b\o\o\k
명령 이름 자체를 인용할 수도 있습니다 'grep'
.약간다른 의미. 특히 별칭 조회를 억제합니다. 예를 들어 Ubuntu 시스템에서는 일반적으로 .reference grep
별칭 (또는 그 일부)이 이 별칭을 우회합니다.grep --color=auto
"grep"
gr\ep -Fnrl mysql ./ --exclude-dir _book
이 이야기의 교훈은,사용하는 언어의 인용 규칙을 알아두세요.
아니면 실수를 "해서" 혼란스러운 결과를 낳을 수도 있습니다.