특정 폴더의 하위 폴더에 있는 확장자가 .log인 파일을 모두 찾고 싶어졌습니다. 어떻게 하면 될까요? 저는, 제일 쉬운 방법 중 하나인 grep 으로 하는 방법을 소개하고자 합니다. 물론, 이것 말고도 다른 방법도 있습니다만, 저는 grep을 자주 쓰는 사람이니, 이것을 기준으로 설명해 보도록 하겠습니다.

 


 ls는 디렉토리 내에 있는 내용들을 출력해 주는 명령어입니다. 제가 이것을 쓸 때 습관적으로 쓰는 옵션은 -ail 입니다. man 페이지를 쭉 보시다 보면, 왠지 익숙한 명령어가 보입니다.

 

 

 -R이 보입니다. 이것은, 서브 디렉토리들을 재귀적으로 탐색한다는 의미입니다.

 

 

 다음에, 이 결과물을 가지고 piping을 할 건데요. grep 명령어로 할 거에요. 이 때에는 그냥, 정규 표현식을 입력해 주시면 됩니다. 저는 문제에서 jar 확장자로 끝나는 파일을 찾으라고 했으므로, 아래와 같이 입력하면 됩니다.

 

 

 \\.jar$ 이렇게요. 여기서 백슬래시 2번을 한 것은, .을 문자화 하기 위해서 그렇게 하였습니다. 정규 표현식에서 .은 all character를 의미하기 때문입니다. 그리고 $은 end of pattern을 의미합니다. 즉, 위에 써 놓은 grep 패턴은 .jar로 끝나는 패턴을 의미합니다. 2개의 결과가 나왔는데요. 정말 파일만 나왔는지 확인해 봅시다.

 

 

 -l 옵션을 같이 넣어 봅시다. 그러면 앞에 d가 붙은 무언가가 같이 나왔음을 알 수 있는데요. 이는 a.jar가 디렉토리라는 뜻입니다. 의도치 않은 결과가 나와 버렸네요.

 

 

 -F 옵션을 주면, indicator를 추가합니다. 여기서 append라는 것이 중요한데요. 뒤에 추가한다는 의미입니다. 그랬다면, 폴더 a.jar는 a.jar + @로 바뀔 겁니다. 그렇게 바뀌면, 더 이상 해당 폴더는 .jar로 표시되지 않기 때문에, 패턴에 걸리지 않습니다.

 

 

 -F를 붙였을 때와 그렇지 않았을 때 차이를 보여주고 있습니다. 그런데, 폴더 명이 .로 시작하는 경우가 있습니다. 이 폴더 내부도 탐색해야 한다면 어떻게 해야 할까요? 예를 들자면 .oh-my-zsh 등이 있는데요.

 

 

 .oh-my-zsh 안에는 README.md 파일이 있습니다. /home/cho에서 탐색을 할 때, -a를 추가로 붙이면 어떨까요?

 

 

 그러면, README.md도 탐색을 했음을 알 수 있습니다. 그리고 CODE_OF_CONDUCT.md도 같이 패턴에 걸려들었음을 알 수 있습니다. 따라서, 어떤 폴더 내에서 .jar 확장자를 가지는 파일들을 찾는 명령어는 아래와 같습니다.

 

 

 ls에 Recursive, F, All 옵션을 붙인 결과물을 grep의 입력값으로 받으시면 됩니다. 이는 piping 처리로 쉽게 할 수 있습니다.

 

 

 -a 옵션은 .로 시작하는 것을 무시하지 않는 차이가 있다는 것만 man 페이지에서 찾으실 수 있으시면 됩니다. 그런데 옵션만 3개라. 뭔가 복잡해 보입니다. 그리고 비슷한 질문을 검색해 보면, 아래의 질답글이 나오는데요, 스택 오버플로우에서는 ls를 사용하는 게 복잡하다는 댓글이 있습니다.

 


 게다가, 뭔가 허전한 거 같군요. 조건을 만족하는 파일만 떨구면 뭐하나요? 경로를 못 찾겠습니다. 경로까지 떨굴려면, find 명령어를 쓰시면 됩니다. 역시 이것도 grep이랑 같이 쓰면 매우 강력해지는 명령어 중 하나입니다. man find를 쳐 봅시다.

 

 

 보다 보면 type 옵션이 나옵니다. 여기서 우리는, 디렉토리가 아닌 보통의 파일만 출력하면 되므로, -type 옵션을 주고 f만 출력하겠다고 명시하시면 됩니다. 리눅스 프로그래밍 수업을 들으셨다면 아셔야 할 것들이기도 합니다.

 

 

 완성된 쿼리는 위와 같습니다. 여기서 .은 제가 현재 있는 위치인 /home/cho를 의미합니다. find는 이것 말고도 어마무시한 옵션들이 있는데요. 다음에 차차 알아가 보도록 하겠습니다.