리눅스 find 명령어는 리눅스에 기본 명령어지만, 주요 기능들에 대해 소개하고자 합니다. 리눅스 find 명령어는 파일 및 디렉토리를 검색하는 데 매우 유용합니다. 리눅스 find 사용 방법은 간단한 것부터 Grep을 이용한 더 강력한 활용 방법까지 다양합니다. 예제 위주로 보시면 사용하시기 편할 것 같습니다.
find [검색 시작 경로] [옵션] [표현식]
-> find [-H | -L | -P | -D] [-f 검색 시작 경로] 경로 ... [표현식]
[검색 시작 경로]: 검색을 시작할 디렉토리의 경로를 지정합니다. 상대 경로, 절대 경로 모두 가능하며 대부분의 리눅스의 경우 이 경로 인자 값을 생략한다면 현재 위치(.)를 입력받은 것으로 간주한다.
[옵션]: 검색에 사용할 다양한 옵션을 설정할 수 있습니다.
[표현식]: 원하는 파일이나 디렉토리를 찾는 조건을 지정합니다.
# 현재 위치(.)로 부터 jpg 확장자 파일 모두 찾기
find . -name "*.jpg"
# /home/user/documents의 txt 파일 찾기
find /home/user/documents -name "*.txt"
실행결과
주요 옵션 상세
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)
옵션
단위
c
1byte 단위 (b아님 주의)
b
1block 단위(1block = 512 bytes)
w
2 bytes 단위
k
1 kb
M
1 mb
G
1 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" {} \;