리눅스 시스템 관리에서 가장 강력한 도구 중 하나인
find명령어의 옵션과 사용법을 정리합니다. 파일명, 권한, 시간, 크기 등 다양한 조건으로 파일을 검색하고-exec나xargs를 통해 후처리하는 방법을 다룹니다.
Test Environment
- OS: CentOS 7
- Shell: Bash
1. 기본 구문 (Syntax)
find 명령어는 지정된 경로 하위의 모든 트리를 탐색하므로 검색 범위 설정에 주의해야 합니다.
find [경로] [조건] [동작]
주요 검색 조건 (Predicates)
- -name [pattern]: 파일 이름으로 검색 (와일드카드 사용 가능)
- -type [d/f]: 파일 타입 (
d: 디렉토리,f: 일반 파일) - -user [name]: 소유자 이름으로 검색
- -group [name]: 그룹 이름으로 검색
- -perm [mode]: 파일 권한으로 검색
- -size [n]: 파일 크기로 검색 (
+n: 이상,-n: 이하, 단위:k,M,G) - -empty: 빈 파일 또는 빈 디렉토리 검색
시간 관련 조건 (Time Stamps)
시간 옵션에서 +n은 n일 이전(Old), -n은 n일 이내(New)를 의미합니다.
- -atime [n]: Access Time (마지막 접근 시간, 일 단위)
- -mtime [n]: Modify Time (마지막 수정 시간, 일 단위)
- -ctime [n]: Change Time (메타데이터 변경 시간, 일 단위)
2. 기본 사용 예제
파일명 및 타입 검색
# 1. 현재 디렉토리(.)에서 이름에 'test'가 포함된 파일 찾기
find . -name "*test*" -print
# 2. 시스템 전체(/)에서 'foobar'라는 이름의 파일 찾기
find / -name "foobar" -print
# 3. 디렉토리만 찾기
find . -type d
# 4. 숨겨진 파일(점으로 시작하는 파일) 찾기
find . -name ".*" -print
권한(Permission) 및 소유자 검색
# 1. 권한이 700인 파일 찾기
find . -perm 700 -print
# 2. 권한이 400 이거나 200인 파일 찾기 (논리 연산 OR 사용)
# 괄호 앞에는 반드시 escape(\) 처리가 필요합니다.
find . \( -perm 400 -o -perm 200 \) -print
# 3. 특정 사용자(foobar) 소유의 파일 찾기
find / -user foobar -print
# 4. 소유자나 그룹이 없는(삭제된 계정 등) 파일 찾기 (고아 파일)
find / \( -nouser -o -nogroup \) -print
# 5. 실행 권한이 있는 파일 찾기 (Others에게 쓰기 권한이 있는 경우 등 보안 점검 시 유용)
find / -perm -2 -print
3. 고급 활용 및 일괄 처리 (Actions)
검색된 파일에 대해 -exec 또는 xargs를 사용하여 추가 명령을 수행할 수 있습니다.
-exec 옵션 사용
{}는 검색된 파일명을 의미하며, \;로 명령을 종료합니다.
# 1. 이름이 core인 파일을 찾아 상세 정보 출력(ls -l)
find . -name core -exec ls -l {} \;
# 2. *.bak 파일을 찾아 즉시 삭제
find . -name "*.bak" -exec rm -f {} \;
# 3. *.txt 파일 내에서 특정 문자열 치환 (Perl 이용)
find / -name "*.txt" -exec perl -pi -e 's/OldString/NewString/g' {} \;
xargs 파이프 연계
많은 수의 파일을 처리할 때는 -exec보다 xargs가 성능상 유리할 수 있습니다.
# 1. 파일 내용에서 특정 문자열 검색 (grep)
find . -type f | xargs grep "검색어"
# 2. 100MB 이상인 파일을 찾아 크기순 보기
find / -size +100M -print | xargs ls -lh
# 3. 최근 30일 동안 수정되지 않은 파일 목록 저장
find / -mtime +30 -print > old_files.txt
4. 실무 유용한 패턴 정리
디스크 정리 및 관리
# 1. 빈 파일(0 byte) 찾기
find / -empty -print
# 또는
find / -size 0 -print
# 2. 최근 30일간 접근하지 않은 파일 리스트 추출
# ! (NOT) 연산자와 -a (AND) 연산자 조합
find / ! \( -atime -30 -a \( -type d -o -type f \) \) | xargs ls -l > not_access.txt
# 3. 특정 디렉토리 하위의 *.bak 파일을 백업 폴더로 이동
# (주의: 백틱 ` 사용 시 파일명이 너무 많으면 에러 발생 가능성 있음)
mv `find . -name "*.bak"` /home/bak/
보안 점검
# 1. Root 권한으로 실행되는 SetUID 파일 찾기 (+4000)
find / \( -user root -a -perm +4000 \) -print
# 2. Others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한 제거
find / -perm -2 -exec chmod o-w {} \;
Next Step:find 명령어로 파일을 찾은 뒤, 로그 분석이나 텍스트 처리가 필요하다면 grep, awk, sed 명령어의 정규표현식(Regex) 활용법을 학습해 보시길 권장합니다.