2011년 7월 28일 목요일

신의 선물 find

약간 뜬금없게 Unix/Linux 유틸리티인 find에 관한 이야기.

find 유틸리티는 파일을 검색하는 도구다. 그것도 매우 귀찮게 터미널을 열고 쉘에서 직접 손으로 타이핑 해서 입력해야 하는 도구다. 그럼에도 불구하고 난 이런 CUI 유틸리티들을 매우 찬양한다. (물론 이건 Unix의 철학을 알아야 하는 이야기다)

한 가지 경험상의 예를 들어보자.

맥(Mac OS X) 사용자인 난 덕후(-_-)답게 일본 애니메이션을 자주 보는 편이다. 그래서 자막(.SMI)도 종종 구하러 돌아다닌다. 너무나 고마우신 자막 제작자들은 대체로 자신의 블로그에 각 화 별로 자막을 압축해서 올려주신다.

한 때 워낙 많은 자막 파일을 받았고 각 자막 파일들은 각자의 이름으로 디렉토리가 생성되어서 거기에 풀려 있던 상황이 있었다. 그런데 이걸 다른 곳에다 옮겨야 한다. 아...

상황을 정리해 보자. 맥 에서 여러 서브디렉토리에 있는 파일들을 현재 혹은 특정 디렉토리로 옮기고 싶다면?

맥(Mac OS X) 이라면 파인더를 열어서 폴더를 하나하나 들어가서 파일을 드래그 해서 밖으로 끄집어 내야 한다. 너무 귀찮다. 특히 디렉토리가 수십개라면???

이럴때 Unix의 철학과 뛰어난 GNU 유틸리티들을 파악하고 있다면 큰 문제가 되지 않는다.

자. 실제로 어떻게 하면 편하게 될지 생각을 해 보자. 우선, 다운로드 받은 자막 파일은 Downloads 폴더 밑에 각 파일 이름의 디렉토리 밑에 압축이 풀려 있는 상황이다. 이 파일들을 Downloads로 이동시켜보자.

Terminal.app(터미널)을 띄우자. 그리고 다음 명령을 입력해 보자.
cd ~/Downloads
find . -name "*.smi"
cd 명령은 Downloads 폴더로 이동하는 명령이다. 여기서 지렁이(~)의 의미는 홈디렉토리이다. 상식이니 알아두자.

하여간, find로 시작하는 명령을 실행시키면 뭔가 파일리스트가 잔뜩 나온다. 이 명령은 가장 기본적인 find 사용법으로, 현재 디렉토리에서 '*.smi' 즉 확장자가 .smi인 파일을 하부 디렉토리 까지 몽땅 검색해 내는 명령이다.

그런데 가끔 윈도우에서 자막 제작하시는 분들 중 확장자를 대문자(.SMI)로 명명하시는 분들도 있다. 그런데 Unix 기반 유틸리티들은 대소문자를 철저하게 가리기 때문에 .SMI 파일들은 검색이 안된다. (윈도우에서는 대소문자를 구분하지 않는다)

그렇다면 대소문자도 구분하도록 해 보자.
find . -iname "*.smi"
이제 확장자가 대문자인 SMI파일도 검색이 된다. -iname 에서 i의 의미는 ignore-case라고 생각하면 된다.

파일을 찾긴 찾았는데 이 파일들을 옮기려면 어떻게 해야할까. 여기서 잠깐 find의 도움말을 찾아보는 것도 센스있는 행동이다.
man find
불행히도 영어로 튀어나올 것이다. 욕 나오겠지만... 참자. 잘 뒤져보면 -exec 라는 옵션이 보인다.

매뉴얼에는 설명이 좀 딱딱할 수도 있다. 간략이 설명하자면 -exec 뒤에는 실행시킬 명령을 쓸 수가 있는데 이 때 {}는 검색된 각 파일 이름이 들어가게 되는 부분이다. -exec의 끝에는 \;를 달아줘야 한다.

명령을 실행시킬 방법을 알아냈다. 그럼 남은 건 파일을 다른 곳으로 이동시키는 명령이다. mv라는 커맨드가 바로 그것인데 설명은 생략하자.

자 mv와 조합을 해 보자.
find . -iname "*.smi" -exec mv {} ~/Downloads \;
이 명령을 실행시키는 순간 모든 자막 파일들이 Downloads 폴더로 모이게 된다.

문제가 해결되었는가?

Unix의 철학은 작은 것이 아릅답다 라는 것이다. 이 말은 각각 작지막 전문적인 일을 하는 작은 도구들을 하나만 쓰지 말고 서로서로 조합해서(도와가면서) 쓰면 너무 편해진다는 의미이다.

위의 설명에서 find는 find 자체만 사용한 것이 아니라 mv 라는 유틸리티도 함께 사용했다. find 혼자만 있었더라면 아무런 도움도 안되었을 텐데 mv의 조합을 통해 find가 엄청난 도구가 되어 버리는 순간이 되었다.

자 그럼 다른 용도로 활용할 준비는 되었는가?

현재 디렉토리 및 하위 디렉토리에서 모든 .torrent 파일을 찾아서 지워보자.
find . -iname "*.torrent" -exec rm {} \;
파일을 지우는 rm 명령과 조합하였다. (참고로 이렇게 지우면 휴지통에 안남으니 조심)

find는 신의 선물이다.

관련링크: [Unix/Linux] 링크만 찾기 / 깨진 링크 찾기

댓글 없음 :