[맥 터미널 / Unix] find 커맨드로 파일 검색하기

맥 터미널(Unix) 환경에서 find 커맨드를 활용하여 파일을 검색하는 방법입니다. GUI 환경에서 스팟라이트나 파인더를 이용하여 파일을 검색하는 방법이 있다면, 마찬가지로 쉘 환경에도 파일을 검색하는 방법들이 다양하게 존재합니다. find 커맨드는 이 중 한가지 방법이며 아래 다른 검색 방법 역시 참고하시면 좋을 듯합니다.

다른 터미널 검색 커맨드(프로그램) ▼

  • locate : 미리 빌트된 데이터베이스에서 빠르게 검색
  • grep : 파일 내의 문장들에서 문자열 패턴을 검색
  • mdfind : 파일의 메타데이터를 검색

find 커맨드 기본 내용

find 등의 커맨드를 사용하시면 GUI 환경에서 꼼수로 숨겨둔 파일은 식은 죽 먹기로 찾으실 수 있습니다. 한번 익혀두면 잘 잊어버리지 않으니 초기에 잘 익혀두고 활용해보시기 바랍니다.

기본 문법 ▼

$find [경로] [플래그] [표현식]
  • 경로 : ‘/’, ‘~’, ‘~/Desktop’ 등 경로를 입력
  • 플래그 : -name 등의 플래그(옵션) 입력
  • 표현식 : 검색할 파일의 이름 혹은 패턴 등 표현식을 입력

몇가지 예시

  • 현재 디렉토리(.) 내 ‘.txt’를 포함한 모든(*) 파일 검색 ▼
$find . -name "*.txt"
  • root 디렉토리(/) 내 ‘.txt’를 포함한 모든(*) 파일 검색 ▼
$find / -name "*.txt"
  • 홈 디렉토리(~) 내 ‘.txt’를 포함한 모든(*) 파일 검색 ▼

* ~을 $HOME으로 대체해주셔도 결과는 같습니다.

$find ~ -name "*.txt"

find 커맨드 활용

find 커맨드를 활용하는 몇가지 예시입니다. 각각의 커맨드에 대한 자세한 설명은 생략하였습니다(작성해둔 관련글이 있을 경우 링크를 연결해두었습니다). 부족한 내용은 구글링해보시길 추천 드립니다.

 

결과물을 카운팅해서 숫자로만 보기

결과물을 일일이 출력하지 않고 카운팅한 결과만 보는 방법입니다. 파이프 옵션과 함께 ‘wc -l’을 사용하시면 됩니다.

$find . -name "*.txt" | wc -l
  • wc : word count의 줄임말

 

파일 크기를 이용하여 찾기

파일 크기(Unix Block Size)를 통해 파일을 찾는 방법입니다. +/- 기호와 숫자를 조합하여 -size [플래그]와 사용하시면 됩니다.

  • +/- : 이상/이하

블록 사이즈가 2보다 큰 파일을 출력 ▼

$find . -size +2 -print

블록 사이즈 5보다 작은 파일들 출력 ▼

$find . -size -5 -print

파일 크기가 ‘4048byte’보다 큰 파일 출력 ▼

$find . -size +4048c -print

참고 ▼

맥 터미널(Unix) 환경에 기본적으로 설정된 블록 사이즈(Block Size) 1512byte입니다. 그래서 ls -s와 같은 옵션으로 파일을 살펴보면 ‘결과물 X 512 Byte’으로 나타나게 됩니다. 우리가 흔히 사용하는 1024byte와는 다른 단위이기 때문에 충분히 혼동이 올 수도 있습니다.

쉘 환경 설정(~/.bash_profile 등)에 export BLOCKSIZE=1024를 추가해주시는 것으로, 우리가 읽기 편리한 단위로 변경하실 수 있습니다.

~/Test (804) $ls -s
total 20
0 ./             4 example1.txt
0 ../             4 example2.txt
8 .DS_Store         4 example3.txt

 

파일 타입으로 구분하여 검색하기

-type 옵션을 통해 파일 타입을 d(directory) 혹은 f(file)로 구분하여 검색 가능합니다.

파일만 검색 ▼

$ find . -name "exam*" -type f
./example1.txt
./example2.txt
./example3.txt

디렉토리만 검색 ▼

$ find . -name "exam*" -type d
./example

파일 및 디렉토리 모두 검색 ▼

$ find . -name "exam*"
./example
./example1.txt
./example2.txt
./example3.txt

 

권한을 통하여 검색하기

‘-perm [권한]’을 통해 권한을 통한 검색도 가능합니다. 권한 설정에 관한 자세한 내용은 링크를 통해 확인 바랍니다.

사용자 부분

  • a : all 사용자 그룹 기타익명을 포함한 모두
  • u : user 사용자
  • g : group 그룹
  • o : other 기타 익명

권한 부분

  • r : 읽기 권한
  • w : 쓰기 권한
  • x : 실행 권한

그룹 부분에 쓰기 권한이 없는 example/ 디렉토리를 가지고 테스트할 예정입니다.

drwxr-xr-x   2 SeongjuneKim  staff    68 Sep 17 22:50 example/
-rw-rw-r--@  1 SeongjuneKim  staff  1371 Sep 17 15:18 example1.txt
-rw-rw-r--@  1 SeongjuneKim  staff  1336 Sep 17 15:11 example2.txt
-rw-rw-r--@  1 SeongjuneKim  staff  1150 Sep 17 17:19 example3.txt

그룹 부분 쓰기 권한이 있는 “ex*” 패턴을 만족하는 파일(혹은 디렉토리) 출력 ▼

* 쓰기 권한이 없는 example/ 디렉토리는 검색되지 않습니다.

$ find . -name "ex*" -perm +g=w
./example1.txt
./example2.txt
./example3.txt
  • 다른 권한 검색은 +[사용자]=[권한] 부분만 수정해주시면 됩니다.

 

시간을 이용한 검색 방법

-cmin, -ctime 플래그를 사용하여 몇시간 전에 수정된 혹은 몇시간 동안 수정되지 않은 파일들을 검색할 수 있습니다.

정확히 30분 전에 수정된 파일 찾기 ▼

$find . -cmin 30

30분 안에 수정되었던 파일 찾기 ▼

$find . -cmin -30

30분 동안 수정되지 않은 파일 찾기 ▼

$find . -cmin +30
  • -cmin을 -ctime으로 변경하시면 단위가 에서 시간으로 변경됩니다.

1시간 안에 수정되었던 파일 찾기 ▼

$find . -ctime -1

 

 

검색된 파일들을 대상으로 파일 내부의 내용(패턴) 찾아내기

검색된 파일들을 대상으로 파일 내부의 패턴을 검색하는 방법입니다. 주로 사용되는 | grep 조합은 find와 사용할 수 없습니다. find 커맨드가 찾아낸 파일들을 grep 프로그램이 어떻게 실행하는지 모르기 때문입니다. 이때, xargs 커맨드를 조합해서 grep의 기능을 그대로 사용하실 수 있습니다.

현재 디렉토리 내의 60분 이내에 수정이 일어난 파일들 중, 내용에 ‘far’를 포함한 라인 출력 ▼

$find . -cmin -60 | xargs grep "far"

출력 ▼

위에 설명드렸던 내용들을 이용하여 좀 더 복잡하게 꼬아보면 아래와 같습니다.

$find . -name "ex*" -type f -size +2 -cmin -60 | xargs grep "far"

 

-not 옵션을 통해 반전

위에서 설명드린 모든 커맨드에 -not만 추가하시면 결과물이 반전됩니다.

현재 디렉토리 내의 파일들 중 시작부터 ex를 포함하지 않는 모든 파일 찾기 ▼

$find . -not -name "ex*"

 

 

-or을 통한 복수 규칙 적용

두가지 규칙이 있을 경우 복수 규칙을 적용하실 수 있습니다. 각각 초록색파란색에 대응되는 녀석들을 찾습니다.

* 복수 규칙을 사용할 때는 괄호를 꼭 \(back slash)로 감싸주셔야하며 또한 띄워쓰기도 중요합니다.

$find . \( -name "*.txt" -or -name "ex*" \)
./example
./example1.txt
./example2.txt
./example3.txt

이상입니다.

참고

댓글 남기기