grep은 키워드나 패턴을 찾는 데 꽤 유용하게 쓰곤 합니다. 특히, grep -rn "keyword" . 꼴은 상당히 강력합니다. keyword를 포함하고 있는 파일을 제 현재 디렉토리에서부터 재귀적으로 찾아주기 때문입니다. 여기서 한 가지 더 질문. 특정 디렉토리를 제외하고 싶습니다. 혹은, 특정한 확장자만 검색 결과에 나오고 싶습니다. 이런 문제 상황들이 생각보다 자주 발생하는데요. 어떻게 하면 되는지 알아보겠습니다.

 


 먼저 --exclude=GLOB입니다. 파일 이름이 pattern에 걸리는 경우 건너 뛴다고 되어 있어요. 그런데, suffix가 match 된다고 합니다. 접두사가 아니라 접미가 걸린다는 의미입니다.

 

 

 --exclude-dir은 파일 이름이 아닌, 폴더를 의미합니다. 폴더의 suffix 패턴이 패턴에 match 되는 경우 pass 합니다. 재귀적으로 돌리는 경우에, subdirectory까지 무시하게 됩니다.

 

 다음에 --include를 봅시다. 이것은 --exclude와 반대로 패턴에 일치되는 파일명을 가지는 파일만 찾습니다. 특정 확장자만 결과로 나타내게 하고 싶을 때 유용합니다.

 


 예제를 몇 개 보도록 하겠습니다. 먼저 제 djangoex 프로젝트 안에서 "Django" 라는 키워드가 들어간 파일을 모두 찾을 거에요. 그런데, 파일 이름이 000으로 시작하는 파일 중에서 찾으려고 해요.

 

  이 경우, grep -rn "Django" . --include=000* 명령어를 입력하면 됩니다. 하나씩 차례대로 봅시다. -rn ~ . 은 현재 명령어를 친 위치에서 재귀적으로 ~를 찾는다는 의미입니다. ~가 Django였으니, Django라는 키워드가 있는 파일을 찾을 겁니다. 다음에 --include가 들어왔는데요. 파일명이 000* 패턴으로 끝나는 것을 찾아요. glob 패턴에서 *은 any string을 의미하기 때문에 000~ 꼴의 파일명은 모두 매치가 됩니다.

 

 결과를 보면 정확하게 0008_sqlquery_analysis.py라던지, 0003_request_prof_file과 같은 000~꼴의 파일명만 match가 됨을 볼 수 있어요. 그런데, venv 아래에 있는 000* 패턴과 일치하는 파일에 Django라는 결과가 뜨는 것을 없애고 싶습니다.

 

 이 경우, --exclude-dir=venv로 입력하면 됩니다. 위 명령어를 해석해 보면, "Django"라는 키워드가 있는 파일을 현재 내가 있는 위치로부터 재귀적으로 찾을 겁니다. 여기서 000* 꼴의 파일명을 가지는 것을 결과에서 취하는데요. 그 중, venv 밑에 있는 결과를 제외합니다. node_modules 아래에 있는 파일들을 결과에서 제외하고 싶을 때에도 비슷하게 사용하면 되겠습니다.

 

 다음에, 결과 중에서 확장자가 txt와 py인 경우만 결과에 나오게 하려고 합니다. venv 밑에 있는 결과는 제외하고요.

 

 이 경우, --include=*.{txt,py}를 입력하면 됩니다. glob에서 {a,b,c}는 a이거나 b이거나 c인 경우 match가 됩니다. 모든 문자열.txt이거나 모든 문자열.py인 경우, *.{txt,py}가 match되게 됩니다.

 

 

 requirements.txt에도 Django==4.1.3이 있었던 모양입니다. 그렇기 때문에, txt 확장자를 가지는 파일도 결과에 나오게 됩니다.

 


-I라는 옵션도 알고 가면 도움이 될 듯 합니다. binary file을 match 결과에서 제외합니다.

 

 예를 들어, 제 현재 프로젝트 root 폴더에서, request_filters*py* 패턴의 이름을 가지는 파일을 검색하면, request_filters.py와, request_filters.cpython-310.pyc 2개의 결과가 나옵니다. 그런데, 이 pyc는 binary file이라고 되어 있어요. 이 바이너리 파일을 결과에서 제외하려고 할 때 -I 옵션을 넣게 됩니다.

 

 

  grep -rnI "Django" --include=request_filters*py*를 입력해 봅시다. 그러면 아까와 다르게 binary file이 제거된 결과를 얻게 됩니다.