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

GUI 환경에서 Spotlight나 Finder를 이용하여 파일을 검색하는 방법이 있다면, 터미널에도 다양한 방법으로 파일을 검색하는 방법들이 있습니다. 우선, 간단한 파일 이름 위주의 검색이라면 locate command를 사용하시면 편리하고, 파일 내의 문장들에서 패턴을 검색하고자 하신다면, grep command를 사용하시면 됩니다. 하지만, 좀 더 고급진 검색을 하시고 싶으시면, find command를 이용하시면 됩니다.


find command로 파일 검색하기

문법 및 기본 예제

$find flags pathname expression

간단한 예제로 아래를 보시면, 현재 폴더(.)부터 .txt를 포함하는 모든 파일을 탐색해서 출력하라는 의미입니다. *와 같은 wildcard가 궁금하시다면 링크를 참조바랍니다.

$find . -name "*.txt"

/로부터 시작하시려면 아래와 같이 하시면 되고,

$find / -name "*.txt"

~으로부터 시작하시려면 아래와 같이 하시면 됩니다. 물론, ~을 $HOME으로 대체 주셔도 결과는 같습니다.

$find ~ -name "*.txt"

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

결과물을 일일이 출력하지 않고 카운팅한 결과만 보고자 하신다면, | wc -l을 사용하시면 됩니다. wc는 word count의 줄임말로 기억하시면, 금방 기억하시겠죠?

$find . -name "*.txt" | wc -l


파일 크기를 이용하여 찾기

기본적으로 유닉스에 세팅된 블록사이즈 1은 512-byte입니다. 그래서 ls -s와 같은 옵션으로 파일을 보았을 때, 보이는 파일 크기는 결과물 X 512 Byte 입니다. 필자는 ~/.bash_profile에서 기본 블록사이즈 1을 1024 Byte로 세팅해놓았기 때문에, 아래에 있는 example[1-3].txt는 모두 4kb(4 X 1024)입니다. 기본 블록사이즈를 수정하는 방법은 ~/.bash_profile 파일을 열어 export BLOCKSIZE=1024를 추가해주면 됩니다. 자세한 설명은 링크를 참조 바랍니다.

1
2
3
4
5
~/Test (804) $ls s
total 20
0 ./             4 example1.txt
0 ../             4 example2.txt
8 .DS_Store         4 example3.txt
cs

 

본론으로 돌아가 파일 크기를 find로 검색할 때, 위의 블록 사이즈를 이용하여 검색을 합니다. +/-를 통해 이상/이하를 나타내며 검색하시면 됩니다. 아래 예제는 현재 폴더에서 블록사이즈 2보다 큰 파일들을 출력하는 예제입니다.

$find . -size +2 -print

몇가지 예제를 더 보도록하겠습니다.

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

$find . -size -5 -print

블록사이즈 4048byte보다 큰 파일 출력:

$find . -size +4048c -print

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
drwxr-xr-x   7 SeongjuneKim  staff   238 Sep 17 22:50 ./
drwxr-xr-x+ 58 SeongjuneKim  staff  1972 Sep 17 21:40 ../
-rw-r–r–@  1 SeongjuneKim  staff  6148 Sep 17 15:10 .DS_Store
drwxr-xr-x   2 SeongjuneKim  staff    68 Sep 17 22:50 example/
-rw-r–r–@  1 SeongjuneKim  staff  1371 Sep 17 15:18 example1.txt
-rw-r–r–@  1 SeongjuneKim  staff  1336 Sep 17 15:11 example2.txt
-rw-r–r–@  1 SeongjuneKim  staff  1150 Sep 17 17:19 example3.txt
~/Test (821) $find . -name “exam*” -type f
./example1.txt
./example2.txt
./example3.txt
~/Test (822) $find . -name “exam*” -type d
./example
~/Test (823) $find . -name “exam*”
./example
./example1.txt
./example2.txt
./example3.txt
~/Test (824) $
cs

 


권한을 통하여 검색하기

-perm [권한]을 통해 권한을 통한 써치도 가능합니다. 간단하게 설명하면,

사용자 부분

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

권한 부분

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

입니다. 권한 설정에 관한 자세한 설명은 링크를 참조 바랍니다.

아래와 같이 설정된 권한이 설정된 상황에서,

1
2
3
4
5
6
7
drwxr-xr-x   7 SeongjuneKim  staff   238 Sep 17 22:50 ./
drwxr-xr-x+ 58 SeongjuneKim  staff  1972 Sep 17 21:40 ../
-rw-r–r–@  1 SeongjuneKim  staff  6148 Sep 17 15:10 .DS_Store
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
cs

각기 다른 결과물을 보실 수 있습니다. 초록색으로 표시된 example directory는 그룹에 쓰기 권한(w)이 없기 때문에 걸려지게 됩니다.

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

$find . -name "ex*" -perm +g=w
1
2
3
4
5
6
7
8
9
10
~/Test (831) $find . name “ex*” perm +g=w
./example1.txt
./example2.txt
./example3.txt
~/Test (832) $find . name “ex*”
./example
./example1.txt
./example2.txt
./example3.txt
~/Test (833) $
cs

 

마찬가지로, -perm +[사용자]=[권한] 부분만 수정해주시면 됩니다.


시간을 이용한 검색 방법

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

정확히 30분 전에 수정된 파일 입력 :

$find . -cmin 30

30분 안에 수정되었던 파일 입력 :

$find . -cmin -30

30분 동안 수정되지 않은 파일 입력 :

$find . -cmin +30

마찬가지로 -cmin을 -ctime으로 바꾸면 단위가 시간으로 환산됩니다.

1시간 안에 수정되었던 파일 입력:

$find . -ctime -1

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

| grep 옵션은 워낙 강력하고 또 유용하기로 유명합니다. 하지만, find 커맨드로 찾아낸 결과물에 grep을 바로 먹일 수 없는 이유는 find 커맨드가 찾아낸 파일을 어떻게 여는지 모르기 때문입니다. 하지만 xargs 커맨드를 사용하게 되면, 이를 해결할 수 있습니다. grep command에 관한 자세한 설명은 링크를 참조바랍니다.

현재 폴더 내의 60분 이내에 수정이 일어난 파일들 중, 내용에 “far”를 포함한 line 출력하는 입력 :

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

출력 :

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

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

-not 옵션을 통해 반전

위에서 설명드린 모든 커맨드에 -not을 추가하게 되면, 결과물이 반대가 됩니다. 즉,

$find . -not -name "ex*"

위 커맨드는 현재 폴더 내의 파일들 중 시작부터 ex를 포함하지 않는 모든 파일들을 찾아줍니다.


-or을 통한 복수 규칙 적용

아래 커맨드로 복수 규칙을 적용 가능합니다. 각기 초록색과 파란색에 대응되는 녀석들이 나타나게 됩니다. 아래 복수 규칙을 사용할 때는 괄호를 꼭 \(back slash)로 감싸주셔야하며, 또한 띄워쓰기도 중요합니다.

$find . \( -name "*.txt" -or -name "ex*" \)
1
2
3
4
5
~/Test (849) $find . \( -name “*.txt” -or -name “ex*” \)
./example
./example1.txt
./example2.txt
./example3.txt
cs

 


참고

댓글 남기기