find 명령어를 사용하는데 “좋은” 이유가 필요한 건 아닙니다.
find를 사용하면 시스템을 탐색하는 대신, 무언가를 더 쉽게 검색할 수 있습니다.
- Seth Kenlon (Red Hat Blog 저자)
find명령어는 리눅스에서 파일이나 디렉토리를 검색하고 싶을 때 사용하는 명령어입니다.
본 명령어는 다음과 같은 방법으로 사용할 수 있습니다.
$ find [경로] [옵션] [표현식]
find 명령어의 인자는 크게 두 종류로 나뉩니다.
- 옵션 (Option): 실행 방식 자체를 제어
- 표현식 (Expression): 어떤 파일을 찾을지 정의
| 표현식 | 설명 |
|---|
-name pattern | 파일 이름이 pattern과 일치 |
-iname pattern | 대소문자 구분 없이 이름 일치 |
-path pattern | 전체 경로가 pattern과 일치 |
-ipath pattern | 대소문자 무시하고 전체 경로 일치 |
-regex pattern | 전체 경로가 정규표현식과 일치 |
-iregex pattern | 대소문자 무시한 정규표현식 |
-wholename pattern | -path와 동일 |
-lname pattern | 심볼릭 링크가 가리키는 경로가 일치 |
-ilname pattern | 위 조건에서 대소문자 무시 |
f: 일반 파일
d: 디렉토리
l: 심볼릭 링크
c: 문자 디바이스
b: 블록 디바이스
s: 소켓
p: FIFO (named pipe)
| 표현식 | 설명 |
|---|
-size n[cwbkMG] | 파일 크기 비교 |
c: byte
w: 2-byte 단위
k: KB
M: MB
G: GB
+n: n보다 큼
n: n보다 작음
n: 정확히 일치
| 표현식 | 설명 |
|---|
-mtime n | 수정된 지 n일 전 |
-mmin n | 수정된 지 n분 전 |
-atime n | 마지막 접근 n일 전 |
-amin n | 마지막 접근 n분 전 |
-ctime n | inode 변경 n일 전 |
-cmin n | inode 변경 n분 전 |
-newer file | file보다 최근 수정 |
-anewer file | file보다 최근 접근 |
-cnewer file | file보다 최근 상태 변경 |
| 표현식 | 설명 |
|---|
-user username | 소유자가 username |
-uid n | UID가 n |
-group groupname | 그룹이 groupname |
-gid n | GID가 n |
-nogroup | 없는 그룹 ID 소속 |
-nouser | 없는 사용자 ID 소속 |
-perm mode | 퍼미션이 정확히 일치 |
-perm -mode | 최소한 mode 포함 (AND) |
-perm /mode | mode 중 하나라도 포함 (OR) |
| 표현식 | 설명 |
|---|
-links n | 하드링크 수가 n |
-samefile file | file과 같은 inode (같은 파일) |
| 표현식 | 설명 |
|---|
-empty | 비어있는 파일 또는 디렉토리 |
-false | 항상 거짓 |
-true | 항상 참 |
-fstype type | 파일 시스템 종류 일치 |
| 표현식 | 설명 |
|---|
-exec command {} \\; | 각 파일에 대해 command 실행 |
-exec command {} + | 여러 파일을 한 번에 실행 |
-execdir command {} \\; | 파일 디렉토리에서 실행 |
-ok command {} \\; | 사용자 확인 후 실행 |
-okdir command {} \\; | 디렉토리 기준 + 확인 실행 |
-print | 경로 출력 |
-print0 | 널 문자로 구분된 출력 |
-printf format | C 스타일 포맷 출력 |
-ls | ls -dils 스타일 출력 |
-fls file | -ls 결과를 파일로 저장 |
-fprint file | 경로를 파일로 출력 |
-fprint0 file | 널 문자로 구분하여 출력 |
-fprintf file format | 지정 포맷으로 파일 출력 |
| 연산자 | 설명 |
|---|
-a 또는 생략 | AND (둘 다 참) |
-o | OR (하나라도 참) |
! 또는 -not | NOT (부정) |
( ) | 논리 조건을 그룹화할 때 사용. 셸에서 괄호는 특별하므로 (, )로 이스케이프 필요 |
| 옵션 | 설명 |
|---|
-P | 기본값. 심볼릭 링크를 따라가지 않고, 링크 자체만 처리함. |
-L | 심볼릭 링크를 따라감. 즉, 링크가 가리키는 실제 파일이나 디렉토리까지 탐색함. 루프가 생길 위험 있음. |
-H | 명령줄 인자에서만 심볼릭 링크를 따라감. |
| 옵션 | 설명 |
|---|
-noleaf | 디렉토리 하드링크 수를 기준으로 하는 최적화를 비활성화. |
-daystart | -mtime, -atime, -ctime 등의 기준을 "현재 시간"이 아닌, 오늘 0시 기준으로 설정. |
| 옵션 | 설명 |
|---|
-mount 또는 -xdev | 현재 파일 시스템 경계 안에서만 탐색. 다른 디스크, 파티션으로 넘어가지 않음. |
-maxdepth n | 하위 디렉토리를 최대 n단계까지만 탐색. n = 0이면 경로 자체만 검사함. |
-mindepth n | n단계 이상만 탐색. -mindepth 1은 최상위 디렉토리는 무시하고 그 안의 파일들부터 탐색. |
레벨은 0~3까지 있으며, 높을수록 더 복잡한 최적화를 수행.
0: 최적화 없음
1: 기본 (디폴트)
2: 속도 향상 (더 좋은 순서로 실행)
3: 고급 최적화 (덜 자주 참이 되는 조건부터 먼저 검사)
ignore_readdir_race: 디렉토리 탐색 도중 변경(삭제 등)이 일어났을 때 에러를 무시.
noignore_readdir_race: 위와 반대로, 변경이 생기면 에러 발생시킴. (기본값)
| 옵션 | 설명 |
|---|
-D help | 디버깅 옵션 설명 출력 |
-D tree | 표현식 트리를 출력 (우선순위 구조 확인용) |
-D exec | -exec, -execdir, -ok, -okdir의 실행 흐름 진단 |
-D opt | 어떤 최적화가 적용됐는지 확인 |
-D rates | 각 표현식이 몇 번 참/거짓 판별됐는지 비율 표시 |
-D search | 디렉토리 탐색 흐름 상세 추적 |
-D stat | stat(), lstat() 시스템 호출 추적 (많이 나옴) |
| 옵션 | 설명 |
|---|
-version | find 명령어 버전 정보 출력 |
--help | 사용법 간단 요약 출력 |
$ find ~ -name "*.log" -mtime -7
$ sudo find / -xdev -type f -size +1M -perm /4000
$ find . -O2 -type d -empty -mindepth 1 -maxdepth 3 -exec rm -r {} +