리눅스 find 명령어는 필수적으로 사용하는 리눅스 명령어 중에 하나다. find 명령어는 파일 검색, 검색된 파일 변경, 퍼미션 변경 등 여러가지 작업을 수행할 수 있는 명령어다.
리눅스 파일시스템은 윈도우 파일시스템과 다르며 파일 구조도 비슷하면서도 다르다. 이렇게 복잡한 구조 속에서 파일을 조회, 수정 등의 작업을 편리하게 하기 위해서 리눅스 find 명령어 사용방법에 대해서 알아보자.
일반적인 find 명령어 수식
find /usr/local/ -name php
또는
find /usr/local/ -name “php”
또는
find /usr/local/ -name “php” -print
3가지 명령어 중 어떤 형태로든 결과는 동일하게 출력된다.
/usr/local/ 하위디렉토리에서 “php”라는 이름이 들어간 파일을 찾는 것이다. 가장 많이 사용되는것이고 가장 편리하게 사용된다.
find 명령어 사용법
find –help
또는
man find
이 2가지 명령어를 사용하면 find 명령어 사용법에 대해서 자세히 설명되어 있다.
아래는 find 사용법에 대해서 간단히 설명했다.
사용법 : find [path…] [expression]
기본값 : default path는 현재 디렉토리; default expression은 -print
표현식(expression) 구성 :
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow –help
-maxdepth LEVELS -mindepth LEVELS -mount -noleaf –version -xdev
tests (N can be +N or -N or N):
-amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
-xtype [bcdpfls]
actions:
-exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
-ok COMMAND ; -print -print0 -printf FORMAT -prune -ls
1) 일반적인 옵션
-a’xxxx’
‘xxxx’에 대한 Access(접근)
-c’xxxx’
‘xxxx’에 대한 Changes(변경), 마지막으로 Access한 경우 변경됨
-m’xxxx’
‘xxxx’에 대한 Modify(수정), 파일내용 자체 수정한 경우
-i’xxxx’
‘xxxx'(inum 제외)에 대한 Insensitive(대소문자 구분없이)
2) 자주 사용되는 옵션
N
정확하게 N과 일치
+N
N 보다 큰 경우
-N
N 보다 작은 경우
-name PATTERN
PATTERN에 일치하는 파일 찾기, 와일드카드 문자 사용가능
-iname PATTERN
PATTERN에 일치하는(insensitive) 파일 찾기
-perm [+-]mode
PERMission(‘mode’)에 해당되는 파일 찾기, ls와 결합 가능
-type [bcdpfls]
b(블럭파일), c(특정 문자), d(디렉토리), p(파이프),
f(정규표현 일반파일), l(링크), s(소켓) 유형의 파일 찾기
-size N[bckw]
파일 크기가 N 인 파일 찾기
b(블럭-기본값), c(bytes), k(kbytes),
w(2바이트 단어)
-user NAME
NAME은 유저이름이거나 UID
-atime N
N*24 시간 동안에 Access 한 파일
-ctime N
N*24 시간 동안에 Changes 한 파일(내용수정이 아니고 읽기모드도 Changes됨)
-mtime N
N*24 시간 동안에 Modify 한 파일
-empty
파일이 비어 있고(0 bytes), 정규식 파일이거나 디렉토리
-newer FILE
FILE 보다 최근에 갱신된 파일
-path PATTERN
path가 PATTERN과 일치하는 path에 대해서 검색
-regex PATTERN
파일이름이 PATTERN에 일치하는 정규식에 대해서 검색
-inum N
inode N을 갖는 파일
-nouser,-nogroup
USER나 GROUP에 이름이 없는 파일 검색(UID,GID만 있는 파일)
-exec COMMAND
검색된 파일을 찾으면 COMMAND 명령을 실행한다.
COMMAND 인자(검색된 파일)는 {}으로 사용하며,
이때 COMMAND 끝은 \;(;이 아님)을 사용해야 한다. 즉 명령구분
문자인 ‘;’을 탈출(\)시켜줘야 한다.
-ok COMMAND
-exec COMMAND와 같지만 COMMAND를 실행하기 전에 확인을 요청한다.
3) path 옵션
.
현재 디렉토리(기본값이므로 생략해도 됨)
`pwd`
현재 디렉토리와 결합(?) `은 ~문자가 있는 자판
$(pwd)
위의 `pwd`와 같거나 비슷함
/
최상위 루트 디렉토리에서 하위 모든 디렉토리
/home
특정 /home 디렉토리에서 하위 모든 디렉토리
/{usr,home/{aaa,san2},var}
/usr, /usr/home/aaa /usr/home/san2 /var
4) 표현식과 연산자
\( 표현식 \)
‘표현식’을 우선적으로 먼저 수행
(와 )앞에 \를 넣어야 하며, ‘표현식’과 공백을 각각 둔다.
\( A + B \) * \( C + D \) 와 같이 \(, \)안을 우선적으로 수행
! 표현식 , -not 표현식
‘표현식’을 부정
표현식1 -a 표현식2, 표현식1 -and 표현식2
표현식1과 표현식2의 AND 연산
표현식1 -o 표현식2, 표현식1 -or 표현식2
표현식1과 표현식2의 OR 연산
find 명령어 예제
1) ls,xargs와 같은 다른 명령어와 결합사용
-exec 이용시
# find ….. -exec COMMAND {} \;
-exec를 사용하여 그 인자를 {}로 사용
xargs 명령어로 표준 입력받아 COMMAND 수행
# find ….. | xargs COMMAND
xargs 명령어로 find에서 넘어온 결과(표준출력)에 대해서 COMMAND를 실행
ls 명령어로 최종 결과 출력
# ls -l `find …..[COMMAND]`
또는
# find …. ls
(ls는 ls -dils와 같음)
find 결과물에 대해서 ls 명령어를 실행
xargs
xargs rpm 정보보기
# rpm -qi `rpm -qf $(which xargs)`
또는
# rpm -qf `which xargs` | xargs rpm -qi
2) 퍼미션 관련 예제
find `pwd` -perm -2 -print | xargs ls -l
여기에서 2는
퍼미션이 ——-w- 와 일치하는 파일이며 -의 의미는 rwx-중 하나이다.
2인 이유는 아래와 같다.
만약 퍼미션이 755 이라면,
700 : rwx—— : user
50 : —r-x— : group
5 : ——r-x : others
————————
755 : rwxr-xr-x : others는 읽기와 실행 권한
따라서 others의 권한은 8진수로 5(r+x)이다.
그렇다면, others가 쓰기(w:2) 권한은 당연히 ——-w-
그룹이나 others에게 쓰기 권한이 있는 파일일 경우
-perm -20 -o -perm -2
그룹과 others에게 모두 쓰기 권한이 있는 파일일 경우
-perm -22
□others에게 w 권한이 있는 파일에 w 권한 없애기
find `pwd` -perm -2 -print | xargs chmod o-w
또는
find `pwd` -perm -2 -exec chmod o-w {} \; -print | xargs ls -l
위와 같이 하게 되면 파일 퍼미션이 변경된 결과를 출력하게 된다.
3) UID GID 변경하기
UID와 GID에 대한 유저가 없는 파일을 root.root로 바꾸어 보겠다.
파일 리스트 출력 확인
find . \( -nouser -o -nogroup \) -print | xargs ls -l | more
결과가 출력되었다면 아래 명령어로 변경하기
find . \( -nouser -o -nogroup \) -print | xargs chown root.root | more
또는
find . \( -nouser -o -nogroup \) -exec chown root.root {} \; -print | xargs ls -l
find 명령어 실무에 사용되는 팁
아래 명령어는 실무에서 자주 사용되는 명령어이며 활용도가 매우 높은 명령어 중 하나다.
최근 하루(1) 동안(-)에 변경(change)된 파일을 찾기(-ctime)
find / -ctime -1 -a -type f | xargs ls -l | more
오래된 파일을 찾기(30일 이상 수정(modify))되지 않은)
find / -mtime +30 -print | more
최근 30일(30) 안에(-) 접근(access)하지 않은 파일과 디렉토리를 리스트로 만들려면(-atime)
find / ! \( -atime -30 -a \( -type d -o -type f \) \) | xargs ls -l > not_access.list
현재 자신의 홈디렉토리에서 만 검색하기
find $HOM …
또는
find ~root ..
서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색하기
find . -prune …
특정 유저(foobar) 소유의 파일을 찾기
find / -user foobar -print | more
퍼미션이 777인 파일을 찾기
find / -perm 777 -print | xargs ls -l | more
others에게 쓰기 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more
others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한을 없애기
find / -perm -2 -print | xargs chmod o-w
또는
find / -perm -2 -exec chmod o-w {} \; -print | xargs ls -l | more
유저이름과 그룹이름이 없는 파일을 찾기
find / \( -nouser -o -nogroup \) -print | more
빈 파일을 찾기
find / -empty -print | more
또는
find / -size 0 -print | more
파일크기가 100M 이상된 파일을 찾기
find / -size +102400k -print | xargs ls -hl
*.bak 파일을 찾아 삭제
find / -name “*.bak” -exec rm -rf {} \;
*.bak 파일을 찾아 특정 디렉토리로 이동
특정 디렉토리만 찾기
find . -type d …
root권한으로 실행되는 파일을 찾기
find / \( -user root -a -perm +4000 \) -print | xargs ls -l | more
다른 파일시스템을 검색하지 않게 하기
find / -xdev …
파일이름에 공백이 들어간 파일을 찾기
find / -name “* *” -print
숨겨진(hidden) 파일을 찾기
find / -name “.*” -print | more
같은 이름을 가진 디렉토리를 찾기
find / -type d -print | awk -F/ ‘{printf(“%s\t%s\n”,$NF,$0);}’ | sort| more
잘못된 링크를 찾기
find . -type l -print | perl -nle ‘-e || print’ | xargs ls -l