리눅스 find 명령어 사용법 및 4가지 활용법

리눅스 find 명령어는 리눅스에 기본 명령어지만, 주요 기능들에 대해 소개하고자 합니다. 리눅스 find 명령어는 파일 및 디렉토리를 검색하는 데 매우 유용합니다. 리눅스 find 사용 방법은 간단한 것부터 Grep을 이용한 더 강력한 활용 방법까지 다양합니다. 예제 위주로 보시면 사용하시기 편할 것 같습니다.

리눅스 find 기본 사용법 (링크)

find [검색 시작 경로] [옵션] [표현식]
-> find [-H | -L | -P | -D] [-f 검색 시작 경로] 경로 ... [표현식]

[검색 시작 경로]: 검색을 시작할 디렉토리의 경로를 지정합니다. 상대 경로, 절대 경로 모두 가능하며 대부분의 리눅스의 경우 이 경로 인자 값을 생략한다면 현재 위치(.)를 입력받은 것으로 간주한다.
[옵션]: 검색에 사용할 다양한 옵션을 설정할 수 있습니다.
[표현식]: 원하는 파일이나 디렉토리를 찾는 조건을 지정합니다.

# 현재 위치(.)로 부터 jpg 확장자 파일 모두 찾기
find . -name "*.jpg"

# /home/user/documents의 txt 파일 찾기
find /home/user/documents -name "*.txt"

실행결과

리눅스 find 기본 사용법 결과 화면

주요 옵션 상세

  • H : 심볼릭 링크를 따라가지 않으나, Command Line Argument를 처리할 땐 예외.
  • L : 심볼릭 링크에 연결된 파일 정보 사용.
  • P : 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체 정보 사용.
  • D : 디버그 메시지 출력.

표현식

  • name : 해당 이름의 파일을 찾는다. (가장 많이 쓰이는 옵션) 해당 이름에는 정규 표현식을 활용할 수 있음
  • type : 지정한 파일 유형을 찾는다. 파일만 찾고 싶거나 디렉터리만 찾고 싶을 경우 주로 사용한다.
  • user : 지정한 사용자의 파일이나 디렉터리를 찾는다
  • empty : 빈 디렉토리 혹은 빈 파일을 검색한다.
  • delete : 검색된 파일 혹은 디렉토리 삭제한다.
  • exec : 검색된 파일에 대해 지정된 명령 실행한다.
  • path : 지정된 문자열 패턴에 해당하는 경로에서 검색한다.
  • print : 검색 결과를 파일의 절대 경로로 출력한다. 검색 항목은 newline으로 구분.(기본 값)
  • print0 : 검색 결과를 출력한다. 검색 항목을 한줄로 이어서 표시한다.
  • size : 파일 크기를 사용하여 파일 검색.
  • mindepth : 검색을 시작할 하위 디렉토리 최소 깊이를 지정한다.
  • maxdepth : 검색할 하위 디렉토리의 최대 깊이 지정한다.
  • atime : access time 접근 시간 기준으로 찾는다. n일 이내에 액세스된 파일을 찾는다.
  • ctime : change time 수정 시간 기준으로 찾는다. n일 이내에 만들어진 파일을 찾는다.
  • mtime : modify time 변경 시간 기준으로 찾는다. n일 이내에 수정된 파일을 찾는다.
  • cnewer : 앞의 newer가 내용 변경이라면 cnewer라면 파일 상태
  • uid : 지정한 UID소유의 파일이나 디렉터리를 찾는다. (User ID 번호로 찾기)
  • gid : 지정한 GID 소유의 파일이나 디렉터리를 찾는다 (Group ID 번호로 찾기)
  • perm : 지정한 허가권 값을 갖는 파일이나 디렉터리를 찾는다 (permission의 약자)
  • mmin : mmin은 분이 기준 (mtime은 기준이 day)
  • ls : ‘ls -l’과 같은 기능을 한다.
  • inum : node번호가 n인 파일 찾는다.
  • iname : 대소문자를 구분하지 않고 찾는다.
  • prune : 찾은 결과 중 디렉터리가 해당될 때 그 디렉터리 이름만 출력한다. 하위 디렉토리는 찾지 않는다.

 리눅스 find 주요 4가지 사용법

파일명으로 찾기 (-name)

# 현재 디렉토리에서 test가 포함되는 파일을 찾는다.
$ find . -name "*test*"

# 현재 디렉토리에서 .txt 확장자 파일을 찾는다.
$ find . -name "*.txt"

# /user 디렉토리에서 .txt 파일이름으로 끝나는 파일을 찾는다.
$ find /user -name "*.txt"

# 현재 디렉토리에서 .txt 확장자 파일 검색하고, 모두 삭제한다.
$ find . -name "*.txt" -delete

# 현재 디렉토리에서 test로 시작되는 파일을 찾는다.
$ find . -name "test*"

# 현재 디렉토리에서 test로 끝나는 파일을 찾는다.
$ find . -name "*test"

타입으로 찾기 (-type)

option설명
f일반적인 파일
b디렉토리
l심볼링 링크
주요타입 3가지
# 현재 경로 하위 파일/디렉터리/심볼릭링크에서 [검색어]을 검색
$ find . -name [검색어] -type [f|d|l]
# -type 종류
# b : 블록 특수 파일 (block special)
# c : 캐릭터 특수 파일 (character special)
# d : 디렉토리 (directory)
# f : 일반파일 (regular file)
# l : 심볼릭 링크 (symbolic link)
# p : 파이프 파일 (FIFO)
# s : 소켓 (socket)


# devj라는 이름의 일반 파일 검색.
$ find . -name devj -type f

# BLOG라는 이름의 디렉토리만 검색
$ find . -name BLOG -type d

# grep과 type을 응용하여, log 폴더 밑에 192.168.0.100 이라는 문자열(ip형태)이 포함된 파일을 찾는다.
$ find /log/ -type f | xargs grep -n '192.168.0.100'

# 추가설명
# | xargs : 한줄씩 읽는다
# grep -n '192.168.0.100': '192.168.0.100' 이라는 단어를 포함 하는 애를 -n(라인수) 까지 출력을 해준다.

파일 크기로 찾기 (-empty, -size)

옵션단위
c1byte 단위 (b아님 주의)
b1block 단위(1block = 512 bytes)
w2 bytes 단위
k1 kb
M1 mb
G1 gb
# 현재 경로 하위에서 파일 사이즈로 검색
$ find . -size +[SIZE1]c -size -[SIZE2]c
# 파일 크기 값 뒤에 'c' 또는 'k'를 붙임으로써 바이트 또는 킬로바이트 단위로 값을 지정한다.
# b:block, c:bytes, w:2bytes, k:kb, M:mb, G:gb
# +(초과) 또는 -(미만) 이상의 파일크기를 대상으로 한다.

# 현재 디렉토리에서 빈 디렉토리이거나 크기가 0인 파일 검색한다.
$ find . -empty

# 현재 디렉토리에서 devj가 들어가는 빈 디렉토리이거나 크기가 0인 파일 검색하여 삭제한다
$ find . -name "*devj*" -empty -delete

# 현재 디렉토리에서 1024byte와 같은(==1024) 파일 검색
$ find . -size 1024c

# 현재 디렉토리에서 1024byte보다 큰(>1024) 파일 검색
$ find . -size +1024c

# 현재 디렉토리에서 1024byte보다 작은(<1024) 파일 검색
$ find . -size -1024c

# 현재 디렉토리에서 1kb보다 크고 10kb보다 작은(1~10kb) 파일 검색
$ find . -size +1k -size -10k

# 앞서 나온 type을 응용하면 현재 디렉토리에서 타입이 d(디렉토리) 인 파일들 중에 사이즈가 1024이상인걸 검색
$ find . -type d -size +1024

검색된 파일에서 추가 명령 실행하기 (-exec)

검색된 파일에서 추가 명령 실행하기에 대한 결과화면
  • {} : find 에서 검색 결과가 하나씩 들어가는 부분이다
  • \; : -exec 다음부분 명령어를 실행하라는 부분
# 현재 디렉토리에 "devj"가 들어가는 파일을 찾아서 상세정보 출력한다.
$ find . -name "*devj*" -exec ls -l {} \;

# 현재 디렉토리에 있는 파일에서 "devj"가 들어가는 내용 찾는다.
$ find . -type f -exec grep "devj" {} \;

# 현재 디렉토리에 ".txt" 확장자를 찾아서 모두 삭제한다.
$ find . -name "*.txt" -exec rm {} \;

# 현재 디렉토리에서 txt 확장자 파일 상세 정보 출력한다. (ls 명령 사용)
$ find . -name "*.txt" -exec ls -l {} \;

# 확장자가 txt 인 파일의 라인 수 출력한다. (wc 명령 사용)
$ find . -name "*.txt" -exec wc -l {} \;

### 개인적으로 grep과 같이 많이 쓴다.

# java 파일에 main이라는 문자열이 있는지 검색한다. (grep 명령 실행)
$ find . -name "*.java" -exec grep "main" {} \;

# java 파일에 class라는 문자열이 있는 줄수(라인)를 표시한다.
$ find . -name "*.java" -exec grep -n "class" {} \;

Leave a Comment