Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스 find 명령어 완벽 정리 – 기본 문법부터 실전 예제까지

리눅스 셸의 find 명령어는 파일 시스템에서 원하는 파일을 검색할 수 있는 강력한 도구입니다. 파일 이름, 사용자 권한, 크기 등 다양한 조건으로 파일을 찾을 수 있으며, 검색된 파일에 대해 특정 작업(삭제, 명령 실행 등)을 수행할 수도 있습니다.

find 명령어 기본 문법

find 명령어의 기본 문법은 다음과 같습니다:

find [OPTIONS] [PATH] [EXPRESSION]

각 요소의 의미는 다음과 같습니다:

  • [OPTIONS] – 아래 표의 옵션을 사용해 find의 동작 방식을 지정합니다
  • [PATH] – 검색을 시작할 경로입니다
  • [EXPRESSION] – 일치하는 파일을 찾기 위한 조건과, 찾은 파일에 적용할 동작을 정의합니다

주요 옵션(Options)

find 명령어에서 자주 사용되는 OPTIONS는 다음과 같습니다 (매뉴얼 기준):

옵션 설명
-P 심볼릭 링크를 절대 따라가지 않습니다. 기본 동작입니다
-L 심볼릭 링크를 따라갑니다. 파일 정보를 확인하거나 출력할 때 링크 자체가 아닌 링크가 가리키는 실제 파일의 속성을 사용합니다
-H 심볼릭 링크를 따라가지 않되, 명령줄 인수 처리 시에만 예외적으로 따라갑니다

표현식(Expression)

find 매뉴얼에서 제공하는 주요 표현식으로 EXPRESSION을 구성하면, 조건에 맞는 파일을 검색하고 필요시 해당 파일에 작업을 수행할 수 있습니다.

검색 조건 (Tests) 설명
-empty 빈 파일을 찾습니다
-executable 실행 가능한 파일 및 탐색 가능한 디렉터리와 일치합니다
-group 이름 지정한 그룹에 속한 파일을 찾습니다
-mtime n 파일 데이터가 n*24시간 이내, 초과 또는 정확히 그 시점에 마지막으로 수정된 경우 일치합니다
-name 패턴 파일 이름(경로를 제외한 기본 이름)이 지정한 패턴과 일치하는지 검사합니다
-path 패턴 파일의 전체 경로가 지정한 패턴과 일치하는지 검사합니다
-readable 현재 사용자가 읽을 수 있는 파일과 일치합니다
-size n 파일 크기가 n 단위보다 작거나, 크거나, 정확히 같은 경우 일치합니다 (단위는 아래 표 참조)
-type c 파일 유형이 c인 경우 일치합니다 (유형 값은 아래 표 참조)
-user 이름 지정한 사용자가 소유한 파일을 찾습니다
동작 (Actions) 설명
-print 파일 이름을 출력합니다 (기본 동작)
-prune 해당 항목이 디렉터리라면 그 안으로 들어가지 않습니다
-depth 디렉터리 자체보다 내부 내용을 먼저 처리합니다
-delete 일치하는 파일을 삭제합니다 (-depth를 포함하므로 옵션처럼도 작동합니다)
-exec 명령 지정한 명령을 실행합니다
-execdir 명령 -exec와 비슷하지만, 일치한 파일이 있는 하위 디렉터리에서 명령을 실행합니다
-ok 명령 -exec와 같지만 실행 전 사용자에게 확인을 요청합니다
-okdir 명령 -execdir와 같지만 실행 전 사용자에게 확인을 요청합니다
-printf 형식 지정한 형식으로 파일 상세 정보를 출력합니다

표현식 연산자

연산자를 사용하면 여러 조건을 하나의 표현식으로 연결할 수 있습니다:

연산자 설명
-o OR (또는)
-a AND (그리고) — 연산자를 생략하면 기본값으로 적용됩니다

find 명령어의 모든 옵션과 표현식 목록은 다음 명령으로 확인할 수 있습니다:

man find

find 명령어 실전 예제

옵션, 표현식, 동작을 조합하면 단순한 파일 목록 조회부터 복잡한 조건 검색 후 자동 작업 수행까지 다양하게 활용할 수 있습니다. 아래 예제를 참고하세요.

1. 파일 이름으로 찾기

다음 예제는 /home/screw 디렉터리에서 이름이 myfile인 모든 파일을 찾습니다:

find /home/screw -name myfile

파일 유형(type)으로 검색

위 명령은 일반 파일뿐 아니라 디렉터리, 심볼릭 링크, 디바이스 등 파일 시스템의 모든 항목을 반환합니다.

-type f 표현식을 추가하면 일반 파일만 검색할 수 있습니다:

find /home/screw -type f -name myfile

반대로 디렉터리만 검색하려면:

find /home/screw -type d -name myfile

사용 가능한 유형 값은 다음과 같습니다:

유형 설명
b 블록(버퍼링) 특수 파일
c 문자(비버퍼링) 특수 파일
d 디렉터리
p 명명된 파이프(FIFO)
f 일반 파일
l 심볼릭 링크 (-L 또는 -follow 옵션이 활성화된 경우 깨진 링크가 아니면 true가 되지 않음)
s 소켓

대소문자 구분

-name은 대소문자를 구분합니다. 대소문자 구분 없이 검색하려면 -iname을 사용하세요:

find /home/screw -iname mYFiLe

2. 와일드카드·정규식으로 확장자별 검색

파일 이름에 와일드카드(*)를 사용하면 확장자별로 검색할 수 있습니다:

find -L /home/screw -name '*.pdf'

위 명령은 .pdf 확장자를 가진 모든 파일을 찾습니다. 따옴표로 묶인 검색 패턴에는 정규식(regex)도 사용할 수 있습니다.

3. 특정 파일·확장자 제외하기

-not 연산자를 사용하면 특정 이름이나 패턴에 일치하지 않는 결과만 반환할 수 있습니다:

find /home/screw -type f -not -name '*.pdf'

4. 특정 디렉터리 통째로 제외하기

-prune 옵션을 사용하면 일치하는 경로와 그 하위 내용 전체를 결과에서 제외할 수 있습니다. 아래 예제는 /home/screw/junk 디렉터리를 검색 결과에서 제외합니다:

find /home/screw -path /home/screw/junk -prune -o -print

5. 파일 크기로 검색하기

다음 예제는 500KB 미만의 모든 파일을 찾습니다:

find /home/screw -type f -size -500k

두 개의 크기 조건을 조합하면 100KB~200KB 사이의 파일을 찾을 수 있습니다:

find /home/screw -type f -size +100k -size -200k

크기 검색에 사용할 수 있는 단위는 다음과 같습니다:

단위 설명
b 512바이트 블록 (접미사 생략 시 기본값)
c 바이트
w 2바이트 워드
k 키비바이트(KiB, 1024바이트)
M 메비바이트(MiB, 1024 × 1024 = 1048576바이트)
G 기비바이트(GiB, 1024 × 1024 × 1024 = 1073741824바이트)

6. 수정일·접근일로 검색하기

다음 예제는 최근 14일 이내에 수정된 모든 .txt 파일을 찾습니다:

find /home/screw -name '*.txt' -mtime 14

수정일 대신 마지막 접근일 기준으로 검색하려면 -mtime 대신 -atime을 사용하세요.

숫자 앞에 부호(+ 또는 -)를 붙이면 지정한 기간보다 오래되었거나 최근인 파일을 검색할 수 있습니다. 아래 예제는 14일보다 더 오래 전에 수정된 파일을 반환합니다:

find /home/screw -name '*.txt' -mtime +14

날짜 단위 대신 분 단위로 검색하려면 -mtime/-atime 대신 -mmin/-amin을 사용하면 됩니다.

이 외에도 조합할 수 있는 옵션이 매우 많으며, 전체 목록은 다음 명령으로 확인할 수 있습니다:

man find

7. 소유자(사용자/그룹)로 검색하기

/home/screw 디렉터리에서 root가 소유한 모든 파일을 찾으려면 다음을 실행합니다:

find /home/screw -user root

8. 권한으로 검색하기

다음 명령은 전역 읽기/쓰기 권한(777)을 가진 모든 파일을 찾습니다:

find /home/screw -perm 777

권한 체계에 대한 자세한 내용은 chmod 명령어 관련 글을 참고하세요.

9. 여러 조건 조합하기

검색 표현식은 자유롭게 조합할 수 있습니다. 조건 사이에 연산자를 명시하지 않으면 두 조건을 모두 만족해야 일치한다고 간주됩니다 (즉, AND 연산이 기본값입니다).

다음 예제는 최근 14일 이내에 생성된 500KB 미만의 텍스트 파일을 검색합니다:

find /home/screw -name '*.txt' -mtime 14 -type f -size -500k

검색된 파일에 작업 수행하기

기본적으로 find 명령어는 검색 결과를 화면에 출력합니다 (-print 동작을 호출하는 것과 동일).

find /home/screw -name myfile -print

출력 형식 커스터마이징

결과 출력 시 발견된 파일에 대한 추가 정보를 함께 표시하도록 설정할 수 있습니다. 다음 예제는 파일 이름 뒤에 대시(-)와 바이트 단위 파일 크기를 함께 출력합니다:

find /home/screw -name '*.txt' -printf '%f - %s bytes'

파일 크기부터 수정·접근 시간의 세부 날짜 필드까지 다양한 변수로 출력을 커스터마이징할 수 있으며, 전체 목록은 매뉴얼에서 확인할 수 있습니다.

결과를 파일로 저장하기

find 검색 결과를 텍스트 파일로 리디렉션할 수 있습니다:

find /home/screw -name myfile > find_results.txt

파일 삭제하기

-delete 동작은 일치하는 파일을 삭제합니다 (확인 절차 없이 즉시 삭제되므로 주의하세요!):

find /home/screw -name '*.junk' -delete

-exec / -execdir로 명령 실행하기

-exec 동작을 사용하면 각 검색 결과에 대해 임의의 셸 명령을 실행할 수 있습니다:

find /home/screw -name '*.txt' -exec ls -la {} ';'

-exec는 현재 작업 디렉터리에서 명령을 실행합니다. 검색된 파일이 위치한 디렉터리에서 명령을 실행하려면 -execdir을 사용하세요:

find /home/screw -name '*.txt' -execdir ls -la {} ';'

위 두 예제에서 각 검색 결과마다 ls -la가 실행됩니다. 중괄호 {}는 find 검색 결과로 치환되며, ';'는 ls 명령의 인수 목록 끝을 알려 find가 명령의 경계를 인식할 수 있게 해줍니다.

-ok / -okdir로 실행 전 확인받기

-ok 동작은 -exec와 동일하게 작동하지만, 명령 실행 전 사용자에게 확인을 요청합니다. 파일을 삭제하면서 각 파일마다 삭제 여부를 물어보고 싶을 때 유용합니다:

find /home/screw -name '*.txt' -ok rm {} ';'

-okdir 역시 확인을 요청하지만, 검색된 파일이 위치한 디렉터리에서 명령을 실행합니다:

find /home/screw -name '*.txt' -okdir rm {} ';'