기본 문법
find [검색경로...] [조건식] [동작]
find는 시작 디렉터리부터 하위 경로를 재귀적으로 훑으면서 이름·종류·크기·권한·소유자·수정 시각 등 조건에 맞는 항목만 골라내는 명령어입니다. 여러 조건을 조합할 수 있고, 찾아낸 결과에 다른 명령을 실행하는 -exec, 항목을 삭제하는 -delete 같은 동작도 함께 지정할 수 있습니다.
실무에서는 오래된 로그 정리, 특정 확장자 파일 수집, 용량이 큰 파일 추적처럼 '조건으로 대상을 고른 뒤 처리한다'는 작업에 쓰입니다. 보안 점검에서는 SUID/SGID가 설정된 파일이나 다른 사용자가 쓸 수 있는(world-writable) 파일을 찾는 데 활용합니다.
리눅스마스터·RHCSA·LPIC 시험에서는 -name, -type, -size, -perm, -user, -mtime 조건과 -exec, -delete 동작을 조합하는 형태로 출제됩니다. 결과를 sort, wc, xargs와 이어 붙여 목록 파일로 저장하는 문제도 있습니다.
아래 설명과 예제는 Rocky Linux 8(GNU findutils 4.6) 기준입니다. -printf, -delete, -maxdepth 등은 GNU find 확장이라 다른 유닉스 계열의 find에는 없을 수 있습니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-name 패턴 | 파일 이름이 패턴과 일치하는 항목 검색(대소문자 구분, -iname은 구분 안 함) | find /var/log -name "*.log" |
-type 종류 | 종류로 제한. f=일반 파일, d=디렉터리, l=심볼릭 링크 | find /etc -type d |
-size 크기 | 크기 조건. +는 초과, -는 미만, 단위 c(바이트)·k(KiB)·M(MiB)·G(GiB). 단위를 생략하면 512바이트 블록이며, 파일 크기는 지정한 단위로 올림 처리됨 | find /home -type f -size +1M |
-mtime 일수 | 수정 시각 기준. 하루는 24시간이며 소수점 이하는 버림. +7은 수정된 지 7×24시간을 넘긴(실질적으로 8일 이상 지난) 파일 | find /tmp -type f -mtime +7 |
-user 사용자 | 지정한 사용자가 소유한 항목 검색(-group은 그룹 기준) | find /home -user sisley 2>/dev/null |
-perm 모드 | 권한 조건. 숫자만 쓰면 정확히 일치, -는 지정 비트를 모두 포함, /는 지정 비트 중 하나라도 포함 | find /usr/bin -type f -perm /6000 |
-empty | 내용이 비어 있는 파일이나 디렉터리만 검색 | find /home/exercise/cleanup -type d -empty |
-maxdepth 깊이 | 탐색할 최대 깊이 제한(1이면 시작 디렉터리 바로 아래까지). 다른 조건식보다 앞에 써야 함 | find /etc -maxdepth 1 -type f |
-exec 명령 {} \; | 찾은 항목마다 명령 실행. {}가 경로로 치환되며, \; 대신 +를 쓰면 여러 경로를 한 번에 묶어 전달 | find /tmp/demo/conf -name "*.conf" -exec cp {} /tmp/demo/collected/ \; |
-delete | 찾은 항목을 삭제. 조건식 뒤에 써야 하며 되돌릴 수 없음. 실행 전 -delete 없이 목록을 먼저 확인할 것 | find /tmp/old -type f -mtime +30 -delete |
실무 예시
확장자로 파일 찾기
준비: mkdir -p /tmp/demo/src/sub; echo hello > /tmp/demo/src/a.log; echo hi > /tmp/demo/src/sub/b.log; echo x > /tmp/demo/src/c.txt
$ find /tmp/demo/src -type f -name "*.log"
/tmp/demo/src/sub/b.log
/tmp/demo/src/a.log
지정한 디렉터리와 그 하위까지 재귀적으로 훑어 .log 일반 파일만 출력합니다. -type f 를 빼면 .log로 끝나는 디렉터리나 심볼릭 링크도 함께 잡힙니다. 출력 순서는 디렉터리를 읽는 순서를 따르므로 이름순이 아닙니다. 정렬이 필요하면 뒤에 | sort 를 붙이세요.
조건에 맞는 파일 개수 세기
$ find /tmp/demo/src -type f -name "*.log" | wc -l
2
find 결과를 wc -l 로 넘겨 개수만 얻습니다. 확장자별 파일 수를 요약할 때 쓰는 형태입니다. 파일 이름에 줄바꿈이 들어 있으면 개수가 어긋나므로, 정확히 세려면 find ... -printf ".\n" | wc -l 처럼 쓰는 편이 안전합니다.
1MB를 초과하는 파일 목록 만들기
준비: dd if=/dev/zero of=/tmp/demo/src/big.bin bs=1M count=2 2>/dev/null
$ find /tmp/demo/src -type f -size +1M -printf "%f\n" | sort
big.bin
-size +1M 은 1MiB를 초과하는 파일만 선택하고, -printf "%f\n" 은 경로를 뺀 파일명만 출력합니다. sort로 이름 오름차순 정렬합니다. -printf 는 GNU find 확장입니다.
SUID 또는 SGID가 설정된 파일 감사
준비: echo y > /tmp/demo/src/run.sh; chmod 4755 /tmp/demo/src/run.sh
$ find /tmp/demo -type f -perm /6000 | sort
/tmp/demo/src/run.sh
-perm /6000 은 SUID(4000)나 SGID(2000) 중 하나라도 설정된 파일을 찾습니다. 실제 점검에서는 /usr, /bin 등 시스템 경로를 대상으로 목록을 뽑아 기준 목록과 비교합니다. 찾은 파일의 권한을 바꾸기 전에는 해당 프로그램이 SUID를 필요로 하는지 먼저 확인해야 합니다.
찾은 파일을 다른 디렉터리로 복사
준비: mkdir -p /tmp/demo/conf /tmp/demo/collected; echo k > /tmp/demo/conf/app.conf; echo k > /tmp/demo/conf/db.conf; echo k > /tmp/demo/conf/notes.txt
$ find /tmp/demo/conf -type f -name "*.conf" -exec cp {} /tmp/demo/collected/ \; && ls /tmp/demo/collected
app.conf
db.conf
조건에 맞는 파일마다 cp 를 실행해 collected 디렉터리로 모읍니다. .conf 파일만 복사되고 notes.txt 는 제외된 것을 ls 로 확인할 수 있습니다. 파일이 많으면 -exec cp -t /tmp/demo/collected/ {} + 처럼 + 를 써서 호출 횟수를 줄일 수 있습니다. 서로 다른 디렉터리에 같은 이름의 파일이 있으면 나중 것이 앞의 것을 덮어씁니다.
주의할 점
- -name "*.log" 처럼 와일드카드는 따옴표로 감싸세요. 따옴표가 없으면 셸이 먼저 확장해 의도와 다른 결과가 나옵니다.
- find 의 출력 순서는 이름순이 아니라 디렉터리를 읽는 순서입니다. 정해진 순서가 필요하면 sort 를 이어 붙이세요.
- -delete 는 되돌릴 수 없습니다. 먼저 -delete 없이 조건만으로 목록을 확인한 뒤 실행하고, -delete 는 조건식 뒤에 두어야 합니다. 경로를 넓게 잡은 상태에서 실행하면 필요한 파일까지 지워집니다.
- -size 는 지정한 단위로 올림 처리됩니다. 예를 들어 500KB 파일도 1M 단위로는 1로 계산되어 -size -1M 에는 걸리지 않습니다. 단위를 생략하면 512바이트 블록 기준입니다.
- -mtime +7 은 '7일보다 오래된'이 아니라 '수정된 지 7×24시간을 넘긴' 파일이며, 소수점이 버려지므로 실질적으로 8일 이상 지난 파일이 걸립니다. 분 단위가 필요하면 -mmin 을 쓰세요.
- -perm 644(정확히 일치), -perm -644(지정 비트 모두 포함), -perm /644(하나라도 포함)는 의미가 서로 다릅니다.
- / 처럼 넓은 경로를 일반 사용자로 검색하면 'Permission denied' 메시지가 섞입니다. 필요하면 2>/dev/null 로 걸러내되, 이때 권한 때문에 검색되지 않은 영역이 있다는 점은 감안해야 합니다.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
