강좌 & 팁
MS 윈도우 사용자가 리눅스로 옮기기 어려운 이유는 당연히 사용하는 방법이 많이 차이나기 때문이겠습니다. 다행히 요즘은 MS 윈도우의 모양과 사용법이 비슷한 데스크탑 메니져가 나와서 예전보다 어려움이 덜합니다만, 쉘에서 문자 명령을 사용해야 할 경우에는 다시금 어렵다는 생각이 절로 납니다.
아래의 명령을 보시죠.
]$ find . -name *.h -exec grep "fetch" /dev/null {} \;
저 같이 리눅스 초보이신 분은 이게 뭔 소린가 하시겠습니다. ^^ 물론 MS 윈도우에서도 도스창에서 텍스트 명령을 이용할 수 있지만 대부분 사용하지 않죠. 저같은 경우 ping 이나 ipconfig 사용이 고작입니다.
위에 소개한 명령은 현재 위치에서 서브 디렉토리까지 모두 확장자가 .h 인 파일에 대해서 내용 중에 fetch 문자열이 있는 행을 출력하라는 뜻입니다.
저 같은 경우 MS 윈도우에서는 Find In Files 라는 프로그램을 사용합니다. 즉, GUI에 익숙해 있다는 말씀이 되겠습니다.
리눅스에도 이런 프로그램이 있겠습니다만, 웹으로 검색하면 이런 GUI용 프로그램에 대한 소개 보다도 쉘에서 문자로 검색하는 find 사용법이 나옵니다. 윈도우 사용자는 실행 파일이 어디 있는지 알기만 하면 바로 실행하고 원하는 결과물을 찾는데, 리눅스에서는 도스창 같은 터미널에서 쉘로 검색합니다.
위의 명령 행을 보더라도 find 명령과 grep 명령을 연결하여 한 번에 원하는 결과를 찾고 있습니다. 이런 점이 리눅스 초보에게는 어려운 점이 겠습니다만 터미널에서 작업이 많은 분은 오히려 터미널에서 모든 작업을 실행하는 것을 좋아하더군요. 쉘에서 작업하다가 파일 하나 찾으려고 다른 윈도우를 띄우고 하는 것을, 저 같은 경우에는 그게 더 편하고 좋을 것 같은데, 리눅스 고수분들은 오히려 불편해 하더라는 것이죠. 그냥 화려하게 암호문 같은 명령을 주욱 써됩니다.
이란 위 문장을 해석해 보죠.
]$ find . -name *.h -exec grep "fetch" /dev/null {} \;
find . -name *.h 까지는 일반 find 명령이라 어렵지는 않습니다. . 현재 위치에서 파일 이름으로 찾겠다는 것인데, 확장자가 .h 인 파일을 찾겠다는 얘기입니다.
-exec 는 찾은 파일을 가지고 어떤 명령을 수행하라는 뜻으로 -exec 다음부터 ; 문자가 오는 사이의 문장을 실행하라는 뜻이 됩니다. 그런데 위의 문장은 ; 이 아니라 \; 입니다. 이유는 셀 명령에서 ; 는 특수 문자이므로 -exec의 끝 임을 알리는 일반 문자를 만들기 위해 \ 문자를 붙인 것입니다. C 언어를 하신 분은 printf() 문에서 n, r, f 같은 특수 문자 앞에 \ 문자를 사용하는 이유를 생각하신다면 이해가 쉽습니다.
즉, \; 는 -exec 가 실행할 문자의 끝을 알려 줍니다. 그러면 {} 는 무엇일까요? 맞습니다. find 가 하나씩 하나씩 찾아준 파일 이름이 들어가는 것입니다. 예로 find 가 찾은 파일 이름이 stdio.h 이라면 -exec 는 grep "fetch" /dev/null stdio.h 가 되겠지요.
그래서 결국 ]$ find . -name *.h -exec grep "fetch" /dev/null {} \; 명령은 현재 위치에서 서브 폴더까지 모든 *.h 파일에 대해서 fetch 문장이 있는 행을 출력하라는 뜻이 됩니다.
소스가 많아 지거나 헤더 파일이 모아진 곳에 특정 함수를 찾을 때 요긴하기 때문에 꼭 외워야 하는데, 머리가 둔해서 인지 잘 안 외워지네요. ^^;