
find는 상황에 따라서 원하는 파일을 잘 검색할 수 있도록 다양한 옵션과 표현식을 제공한다. 그리고, 표현식을 어떻게 사용하느냐에 따라 필요한 파일을 쉽게 찾을 수 있다.
$ find ./ -name success.log
위 예제는 현재 경로에서 success.log라는 파일을 찾는 예제이다.
$ find -L ./ -perm 644 -name 'rc.*'
파일 권한이 644이면서 rc로 시작하는 파일명을 가진 파일을 검색하는 예제이다.
find는 조건으로 파일을 찾기 위한 방법으로 Option이 아닌 Expression으로 제공한다.
Expression에서는
TestOperationActionPositional Options가 있다Test는 find에서 가장 많이 사용되는 표현식이다. Test에는 다음과 같이
시간 관련 테스트는 파일이 언제 생성되었고, 언제 사용되었으며, 언제 변경되었는지를 현재 시간 기준으로 명시된 분 또는 시간에 해당하는 파일을 찾아준다.
| Test | Description |
|---|---|
| -amin N | 현재 시각을 기준으로 N분 전에 액세스된 파일을 찾아줌 |
| -atime N | 현재 시각을 기준으로 N * 24시간 전에 액세스된 파일을 찾아줌 |
| -cmin N | 현재 시각을 기준으로 N분 전에 이름이 변경된 파일을 찾아줌 |
| -ctime N | 현재 시각을 기준으로 N * 24시간 전에 이름이 변경된 파일을 찾아줌 |
| -mmin N | 현재 시각을 기준으로 N분 전에 내용이 수정된 파일을 찾아줌 |
| -mtime N | 현재 시각을 기준으로 N * 24시간 전에 내용이 수정된 파일을 찾아줌 |
# 현재 Directory에서 24시간 전에 수정된 파일을 찾아서 삭제한다.
$ find ./ -mtime +0 -delete
명시한 파일 기준으로 더 최근에 접근하고, 수정 및 변경이 이루어진 파일을 검색해 준다.
| Test | Description |
|---|---|
| -anewer FILE | 명시된 파일보다 최근에 Access한 파일을 찾아줌 |
| -cnewer FILE | 명시된 파일보다 최근에 Change한 파일을 찾아줌 |
| -newer FILE | 명시된 파일보다 최근에 Modify한 파일을 찾아줌 |
| -newerXY FILE | 명시된 파일의 속성보다 수정된 파일을 찾아줌. 파일 속성은 XY로 표시하며, 다음과 같은 속성이 있으며 속성 B는 Linux에서 사용할 수 없음 a: 파일 참조의 액세스 시간, B: 파일 참조의 탄생 시간, c: inode 상태 변경 시간 참조, m: 파일 참조의 수정 시간 |
# success.log 보다 더 최근에 수정된 파일을 검색
$ find ./ -anewer sucess.log
특정 권한이 부여된 파일을 검색할 수 있다. 예를 들어 소유자만 읽고, 쓸수 있는 파일을 검색하거나, 다른 사용자에게 실행 권한이 부여된 파일을 검색할 수 있다.
| Test | Description |
|---|---|
| -perm MODE | 명시된 파일 권한과 동일한 파일을 검색 |
| -perm -MODE | 명시된 파일 권한이 포함된 파일을 검색 |
| -perm /MODE | 명시된 파일 권한을 소유자, 그룹, 기타로 구분하여 세 개의 권한 중 하나라도 동일한 파일을 검색 |
| -readable | 로그인한 사용자가 읽을 수 있는 파일을 검색 |
| -writable | 로그인한 사용자가 쓸 수 있는 파일을 검색 |
| -executable | 실행 권한이 있는 파일만 검색 |
# 파일 권한 중 하나 이상이 6에 해당하는 파일 검색
$ find ./ -perm /666
Group ID 또는 Group Name, User ID 또는 User Name에 해당하는 파일을 검색할 수 있다.
| Test | Description |
|---|---|
| -gid N | 그룹ID가 명시한 그룹ID N과 동일한 파일 검색 |
| -group GROUP-NAME | 그룹명이 명시한 그룹명 GROUP-NAME과 동일한 파일 검색 |
| -nogroup | 존재하지 않은 그룹ID를 가지고 있는 파일 검색 |
| -nouser | 존재하지 않은 사용자ID를 가지고 있는 파일 검색 |
| -uid N | 사용자 ID가 명시한 사용자ID N과 동일한 파일 검색 |
| -user USER-NAME | 사용자명이 명시한 사용자명 USER-NAME과 동일한 파일 검색 |
# 그룹소유권이 root인 파일 검색
$ find ./ -group root
파일명을 이용하여 검색 할 때 대소문자 구분을 없앤다던가 하여 심볼릭 링크를 검색할 수 있다.
| Test | Description |
|---|---|
| -iname PATTERN | 대소문자 구분없이 패턴과 일치하는 파일 검색 |
| -inum N | 파일의 Inode 번호 N을 갖는 파일 검색 |
| -lname PATTERN | 패턴과 일치한느 심볼릭 링크 검색 |
| -name PATTERN | 패턴과 일치하는 파일 검색 |
| -regex PATTERN | 패턴과 일치한느 경로 검색, Emacs 정규 표현식이 기본값이며, -regextype 옵션을 사용하여 변경할 수 있음 |
| -iregex PATTERN | 대소문자 구분없이 패턴과 일치하는 경로 검색 |
| -samefile NAME | 파일명과 동일한 파일 및 심볼릭 링크 검색, 심볼릭 링크 검색을 위해서는 -L 옵션을 함께 사용해야 함 |
# e로 시작하는 txt파일 검색
$ find ./ -iname 'e*.txt'
현재 Directory를 기준으로 명시된 패턴에 의해 파일의 경로를 검색한다.
| Test | Description |
|---|---|
| -ipath PATTERN | 대소문자 구분하지 않고 패턴과 일치하는 경로를 검색 |
| -links N | N개의 링크를 가지고 있는 경로를 검색 |
| -path PATTERN | 패턴과 일치하는 경로를 검색 |
#f로 시작해 t로 끝나는 경로의 모든 파일 검색
$ find ./ -ipath './f*t'
| Test | Description |
|---|---|
| -empty | 파일 사이즈가 0인 파일을 검색 |
| -size N[cwbkMG] | 명시한 파일 사이즈에 해당하는파일을 검색 b: 512byte block c: byte w: 2byte k: kilo byte M: mega byte G: giga byte |
| -used N | 파일이 변경된 후 N일에 마지막으로 액세스한 파일을 검색 |
# 파일이 변경되고, 5일 안에 액세스한 파일 검색
$ find ./ -used 5
Operation은 위 테스트를 사용해 AND, OR, NOT과 같은 연산을 할 때 사용할 수 있다.
| Test | Description |
|---|---|
| (expr) | 우선순위나 표현식을 그룹핑할 경우 사용되며 \와 함께 사용됨 |
| !expr | 표현식의 반대 결과를 리턴함 |
| -not expr | !expr과 동일함 |
| expr1 expr2 | AND 연산을 수행하며, expr1이 false이면 expr2는 평가되지 않음 |
| expr1 -a expr2 | expr1 expr2와 동일함 |
| expr1 -and expr2 | expr1 expr2와 동일하지만 POSIX 호화은 안됨 |
| expr1 -o expr2 | OR 연산을 수행하며, expr1이 true이면 expr2는 평가되지 않음 |
| expr1 -or expr2 | expr1 -o expr2와 동일하지만 POSIX 호환은 안됨 |
| expr1, expr2 | expr1, expr2를 각각 수행되며, 결과는 expr2에 해당하는 것만 출력됨, 함께 출력을 하기 위해서는 -printf나 -fprintf를 함께 사용해야 함 |
# 파일명이 txt로 끝나지 않는 피일명 검색
$ find ./ ! -name '*.txt'
$ find ./ -not -name '*.txt'
Action은 단독으로 사용되기보다는 Test와 같은 표현식과 함께 사용된다. Action에는 Test와 같은 표현식을 통해 검새된 파일을 인자로 하여 또 다른 명령어를 실행해 주는 명령어 실행 관련 액션과 검색결과를 사용자의 입맛에 맞게 출력해 주는 결과 출력 관련 액션으로 나누어진다.
| Action | Description |
|---|---|
| -delete | |
| -exec COMMAND {}; | 표현식에 의해 검색된 파일을 인수로 받아 -exec 다음의 명령어를 수행함, 인수로 받을 결과값은 중괄호{}로 표현되며 세미콜론;은 역슬래시\와함께 사용해야 함 |
| -exec COMMAND {}+ | -exec와 동일하나 결과값을 연 이어서 보여줌 |
| -execdir COMMAND {}; | -exec와 유사하지만 서브 이렉터리부터 검색하기 때문에 결과값은 파일명만 출력됨 |
| -execdir COMMAND {}+ | -execdir과 동일하나 결과값을 연 이어서 보여줌 |
| -ok COMMAND {}; | -exec와 유사하지만 사용자에게 실행 여부를 확인 후 실행함 |
| -okdir COMMAND {}; | -execdir과 유사하지만 -ok와 같은 방식으로 사용자에게 실해 여부를 확인 후 실행함 |
| -prune | 검색한 패턴이 디렉터리인 경우, 하위 디렉터리의 파일은 검색하지 않음 |
| -quit | -quit 앞에 만난 표현식에 해당하는 파일이 검색되면 검색을 종료함 |
# 검색된 파일 삭제
$ find ./ -name rootfile -delete
# 검색된 파일에서 grep을 이용해 다시 특정 문자열 검색
$ find ./ -name 'expression.txt' -exec grep CPU '{}' \;
| Option | Description |
|---|---|
| -fls file | 표현식에 의해 검색된 파일의 결과를 명시한 파일로 ls -l을 실행한 것과 유사한 결과를 저장함 |
| -fprint file | 표현식에 의해 검색된 파일의 결과를 명시한 파일에 저장함 |
| -fprint0 file | 표현식에 의해 검색된 파일의 결과를 명시한 파일에 뉴라인이나 공백없이 저장함 |
| -fprintf format | 역슬래시\와 퍼센트%로 된 표준 출력 포맷에 맞게 검색된 파일 결과를 보여줌 |
| -fprintf file format | -printf와 비슷하지만 -fprintf와 같이 검색된 파일을 명시한 파일에 저장함 |
| -ls | 표현식에 의해 검색된 파일의 결과를 ls -l을 실행한 것과 유사한 결과를 보여줌 |
| -print; | 표현식에 의해 검색된 파일의 결과를 보여줌 |
| -print0 | 표현식에 의해 검색된 파일의 결과를 뉴라인 없이 보여줌 |
# f로 시작하는 파일을 헌번 더 ls -l한 결과를 파일에 저장
$ find ./ -name 'f*' -fls file.txt
-daystart, -follow, -regextype을 제외한 모든 Positional Option 앞에 지정된 테스트를 포함하여 모든 테스트에 영향을 준다. 이는 명령줄을 구문 분석할 때 Positional Option이 치리되고 파일이 검사될 때까지 테스트는 수행되지 않기 때문이다.
반대로, -daystart, -follow, -regextype Positional Option은 명령 행에서 나중에 나타나는 테스트에만 영향을 미친다.
| Positional Options | Description |
|---|---|
| -d | FreeBSD, NetBSD, MacOS X 및 OpenBSD와의 호환성을 위한 -depth의 동의어 |
| -depth | 서브 디렉터리의 파일을 먼저 검색함 |
| -daystart | 24시간이 아닌 해당일을 기준으로 파일 검색, -amin, -atime, -cmin, -ctime, -mmin 및 -mtime과 함께 사용해야 함 |
| -regextype type | -regex나 -iregex의 정규식 구문을 변경함, 기본 유형은 emacs이며, posix-awk, posix-basic, posix-egrep 및 posix-extended가 있음 |
| -maxdepth levels | 명시한 Level만큼 서브 디렉터리의 파일까지 검색함 |
| -mindepth levels | 명시한 Level의 서브 디렉터리부터 파일을 검색함 |
# 현재 디렉터리부터 검색됨
$ find ./ -name 'P*'
# ./ptn
# ./ptn/ptn1.log
# ./ptn/ptn2.log
$ find ./ -depth -name 'p*'
# ./ptn/ptn1.log
# ./ptn/ptn2.log
# ./ptn
# 현재 시각 기준으로 24시간 안에 수정된 파일 검색
$ find ./ -ctime 0
# 현재 시각 기준으로 현재 날짜에 수정된 파일 검색
$ find ./ -daystart -ctime 0
# 명시된 깊이까지만 검색
$ find ./ -maxdepth 1 -name 'p*'
# ./ptn
# 명시된 깊이까지만 검색
$ find ./ -mindepth 2 -name 'p*'
# ./ptn/ptn1.log
# ./ptn/ptn2.log
find에서 제공하는 옵션에는 Symbolic link와 관련된 옵션, find가 어떻게 파일을 찾는지를 확인하고, find 기능을 디버깅하기 위한 디버그 관련 옵션과 디버그의 레벨을 설정할 수 있는 레벨 관련 옵션이 있다.
| Options | Description |
|---|---|
| -P | 파일을 검샤할 때 파일이 Symbolic link인 경우, Symbolic link 자체의 속성을 검사하며, find의 기본 옵션에 따라서 옵션을 생략하면 -P 옵션으로 적용됨 |
| -L | 파일을 검사할 때 파일이 Symbolic link인 경우, Symbolic link에 연결된 파일의 속성을 검사하여, 검사되는 모든 파일 목록을 보여줌 |
| -H | 파일을 검사할 때 파일이 Symbolic link인 경우, Symbolic link의 속성을 검사하나, 명령 행에 지정된 파일이 Symbolic link인 경우, Symbolic link에 연결된 파일의 속성을 검사함 |
$ find -P ./ -type f -name 'e*'