[맥 터미널 / Unix] locate 커맨드로 초간단 파일 찾기

맥의 터미널을 이용한 파일 찾기는 너무도 간편합니다. Spotlight 역시 간편한 도구임에 틀림없으나, 터미널 내의 locate 프로그램을 사용하면 찾기 작업은 훨씬 더 간단하고 디테일해집니다. locate command를 실행하게 되면, 주어진 조건의 파일 찾기 위해 파일 시스템을 찾아 해매지 않습니다. 미리 Pre-Built되어 있는 데이터베이스에 접근해서 Root 0.5초도 안되는 시간 안에 원하는 결과물을 찾아줍니다.

보통, find command를 root부터 실행하게 되면, 세월아 네월아 기다려야 합니다. 왜냐하면 /를 상위개체로 하고 있는 파일(즉, 모든 파일)을 다 일일이 돌아다니면서 확인해야하기 때문입니다. 예를 들어, 간단한 example3.txt라는 파일 찾기 위해 root부터 검색을 시작한다고 가정했을 때, locate와 find의 성능 차이는 확연합니다.

$find / -name example.txt
$locate example.txt

하지만 locate에도 단점이 있습니다. 실시간 반영이 아니라는 단점이 있고, 업데이트를 해주지 않으면 최근에 생긴 파일들을 찾지 않을 수도 있다는 것입니다. 물론, 업데이트를 실행한다면, 아무 문제 없이 사용할 수 있습니다.


locate command로 파일 찾기

우선, 데이터베이스를 up-to-date로 맞춰야 합니다. 혹은 한번도 locate command를 실행한 적 없는 사용자들은 locate command 실행으로 아래와 같은 메세지를 받게 됩니다.

$ locate 아무거나
1
2
3
4
5
6
7
WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:
  sudo launchctl load /System/Library/LaunchDaemons/com.apple.locate.plist
Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.
cs

 

말 그데로, 아래 커맨드를 실행해 데이터 베이스를 만들어 줍니다. 커맨드 실행 시, 아무 메세지가 나타나지 않지만, 시스템에서 find란 프로세스 이름으로 파일 구조를 게더링합니다. Activity 모니터에 가시면 확인하실 수 있습니다. 이 작업은 짧게는 2분 길게는 10분 정도 걸립니다.

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

작업이 끝나게 되면, command 검색을 시작해봅니다. 순식간에 위치를 반환해줍니다.

1
2
~/Test (745) $locate example3.txt
/Users/SeongjuneKim/Test/example3.txt
cs

 

Wildcard도 동작합니다.

1
2
3
4
~/Test (746) $locate example[13].txt
/Users/SeongjuneKim/Test/example1.txt
/Users/SeongjuneKim/Test/example2.txt
/Users/SeongjuneKim/Test/example3.txt
cs

 

따로 파일 이름을 구분 해줄 필요없이, 키워드만 입력하면 검색 엔진처럼 찾아줍니다. 예를 들어 “exam”이라고 검색하면 “exam-1”, “1-exam”, “example” 등이 다 검색됩니다.

$ locate exam

특정 폴더 내의 파일을 찾고자 해서 정규표현식을 사용한다면.. 안타깝지만 먹히지 않습니다. 예를 들어,

$ locate "/Test/.*txt"

라고 해도 그 어떤 결과물도 찾아낼 수 없습니다. 하지만 파이프 grep을 사용하면 같은 결과를 얻을 수 있습니다.

$ locate txt | grep "/Test/"


데이터 베이스 업데이트

데이터베이스를 업데이트하는 커맨드입니다.

$ sudo /usr/libexec/locate.updatedb

주 단위로 자동으로 업데이트 해주는 커맨드입니다. 물론 뒤의 weekly를 daily, monthly로 바꿔줄 수도 있습니다.

$ sudo periodic weekly

참고

1 COMMENT

댓글 남기기