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이 제거된 결과를 얻게 됩니다.
'OS > 리눅스' 카테고리의 다른 글
리눅스 mkdir -p 옵션을 이용해서 이미 존재하거나 부모 디렉토리가 없는 경우도 처리해 봅시다. (0) | 2022.12.29 |
---|---|
리눅스 xargs 명령어에 대해 알아봅시다. (0) | 2022.12.05 |
리눅스 랜덤 문자열을 생성해 봅시다. (1) | 2022.11.28 |
리눅스 shuf 명령어로 랜덤한 permutation을 뽑아봅시다. (1) | 2022.11.27 |
리눅스 다중 명령어 && || ; 에 대해 알아봅시다 (0) | 2022.10.31 |
최근댓글