find
는 상황에 따라서 원하는 파일을 잘 검색할 수 있도록 다양한 옵션과 표현식을 제공한다. 그리고, 표현식을 어떻게 사용하느냐에 따라 필요한 파일을 쉽게 찾을 수 있다.
$ find ./ -name success.log
위 예제는 현재 경로에서 success.log라는 파일을 찾는 예제이다.
$ find -L ./ -perm 644 -name 'rc.*'
파일 권한이 644이면서 rc로 시작하는 파일명을 가진 파일을 검색하는 예제이다.
find는 조건으로 파일을 찾기 위한 방법으로 Option
이 아닌 Expression
으로 제공한다.
Expression
에서는
Test
Operation
Action
Positional 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*'