시스템/Linux2012. 5. 22. 17:20

오늘은 매번 미루다 리눅스에서 유용하게 쓰이는 find 명령어 에 대하여 정리하고자 합니다.
단어의 뜻에서 볼 수 있듯이 find 명령어는 무엇을 찾는데 주로 쓰이는 명령어 입니다.


하지만 단순히 찾는 것에서 끝나는 것이 아니라 find 명령어는 | 파이프 를 이용하여 리눅스 쉘 스크립트랑 섞어서 무궁무진한
작업을 편하게 해줄 수 있습니다.!

| 파이프를 이용하여 쉘 스크립트와 섞기 전 기초적인 find 명령어에 대하여 간단하게 정리하고자 합니다.

 

우선 find 명령어 의 --help 정보 입니다.

[root@b ~]# find --help
Usage: find [path...] [expression]

default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:

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

positional options (always true): -daystart -follow -regextype

normal options (always true, specified before other expressions):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race

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 -iwholename PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
-context CONTEXT


actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

Report (and track progress on fixing) bugs via the findutils bug-reporting
page at http://savannah.gnu.org/ or, if you have no web access, by sending
email to <bug-findutils@gnu.org>.


위의 내용만 봐서는 이해도 잘 안되고 어떠한 옵션을 써야할지도 모르겠고 그렇습니다.

설명을 하자면 find 명령어는

find [경로] [옵션]

형식으로 실행합니다. 위 --help 에서 tests 에서 보시는바와 같이 여러 가지 예제가 있으며, 검색을 한뒤 결과값에 대하여Acitons 을 실행할 수가 있습니다.

 

즉, -o (or), -a (and), ! (not) 과 같이 여러가지 연산자와 여러가지 옵션, 여러가지 액션을 섞어서

얼마나 응용하느냐에 따라서 원하는 최적의 결과값을 찾을 수 있습니다. 엄청 매력적인 명령어 이지 않습니까?

 

하나씩 아래에서 find 명령어 위 옵션에 대해 차례차례 설명하겠습니다.

tests (N can be +N or -N or N): tests (N can be +N or -N or N):
-amin N N 분 이전에 access한 파일 찾기
-anewer FILE 지정한 파일보다 access 시간이 최신인 파일 찾기
-atime N N 일 이전에 access한 파일 찾기
-cmin N N 분 이전에 생성된 파일 찾기
-cnewer FILE 지정한 파일보다 생성된 시간이 최신인 파일 찾기
-ctime N N 일 이전에 생성된 파일 찾기
-empty 비어있는파일 찾기
-false 항상 거짓인 경우
-fstype TYPE 특정한 파일시스템의 종류 찾기
-gid N N 값의 GID 를 갖는 파일 찾기
-group NAME 특정 그룹 소유자의 파일 찾기
-ilname PATTERN -lname 과 비슷하지만, 대소문자를 구분하지 않는다.
-iname PATTERN 파일 대소문자 무시하여 찾기
-inum N node번호가 n 인 파일 찾기
-iwholename PATTERN -wholename PATTERN 과 비슷하지만 대소문자를 구분하지 않는다.
-iregex PATTERN -regex 와 비슷하지만, 대소문자를 구분하지 않는다.
-links N 링크된 갯수가 n 이상인 파일 찾기
-lname PATTERN 쉘 패턴에 일치하는 기호연결(심볼릭 링크)인 파일 찾기.
이때 메타문자는 `/' 이나 `.'를 예외 취급하지 않음
-mmin N N 분 이전에 modify 파일 찾기
-mtime N N 일 이전에 modify 파일 찾기
-name PATTERN 지정한 이름의 파일 찾기
-newer FILE 지정한 파일보다 최신의 파일 찾기
-nouser 소유자가 /etc/passwd 에 명시되어 있지 않은 파일 찾기
-nogroup 소유그룹이 /etc/group 에 명시되어 있지 않은 파일 찾기
-path PATTERN 패턴과 일치하는 경로 제외하고 찾기
-perm [+-]MODE 특정 퍼미션 권한의 파일 찾기
-regex PATTERN 이름이 정규표현식 패턴과 일치하는 파일 찾기
-wholename PATTERN 특정 패턴에 일치하는 디렉토리안의 내용에 대해서는 find 명령을 생략
-size N[bcwkMG] N값 이상의 파일 찾기
-true 항상 참인 경우
-type [bcdpflsD] 특정 타입의 파일 찾기
-uid N N 값의 UID 를 갖는 파일 찾기
-used N N 값 일 이전에 변경된 파일 찾기
-user NAME 특정 사용자 소유의 파일 찾기
-xtype [bcdpfls] 해당 파일 타입에 연결된 심볼릭 링크 파일 찾기
-context CONTEXT (SELinux에 한하여)파일의 보안 컨텍스트와 일치하는 패턴

위에 보시는거와 같이 옵션은 참 여러가지가 있습니다. 위 옵션들과 Action 을 이용하여 여러가지 작업들을 간편하게 할 수 있습니다.

예를 들자면 특정 소유자를 검색하여 다른소유자로 바꾼다던가, 서버관리자가 모르는 사이에 생성된 파일이나 변경된 파일들의 목록을 확인할 수 있거나, 원하는 파일들을 검색하여 삭제하거나 뭐.. 말로 다 표현을 할 수가 없습니다.

 

아래는 개인적으로 보통(?) 사용하는 find 명령과 옵션의 조합을 정리하였습니다. 유용하게 사용하시길 바랍니다. 후후

 

- 특정 UID 를 찾아 소유자와 그룹을 바꾸기 (UID 는 ID 명령어를 통해 확인가능, 예- id apache )

 

find . -uid 591 -exec chown apache:apache {} \;

 

우선 위 내용을 간단하게 설명하자면!

 

find : 찾기 명령
.    : 은 현재 디렉 아래로

-uid : UID 패턴검색옵션

591 : UID 값이 591인 파일 찾기

-exec : 실행하라 는 명령어

chown apache:apache : 실행할 명령

{}      : find 로 검색하여 나온 결과값을 exec 로 실행한 명령어의 대상으로

\;     : find 에서 -exec 옵션으로 실행할 명령의 끝을 나타냄

 

- 사용자 이름이 없거나 그룹 이름이 없는 파일 찾기 (명령어 중 -o 옵션은 or 연산자 입니다.)

 

find / ( -nouser -o -nogroup ) -print | more

 

- 파일 크기가 800kb 이상인 파일을 찾아서 삭제

 

find / -size +800k -exec rm -rf {} \;

 

- 첫번째 글짜기a 또는 b 두번쨰가 c또는d로 시작하는 모든 파일 찾기([a,b][c,d] 는 정규표현식 입니다. 맞나..?)

  정규표현식은 다음포스팅에서 다루도록 하겠습니다. 

 

find / -name '[a,b][c,d]* -print

 

- 일반사용자에게 쓰기권한(rwx---rwx)이 있는 파일을 찾아서 실행 권한을 삭제 (단, ! 을 사용하여 링크 파일은 제외함)

 

find / -perm +2 ! -type l -print -exec chmod o-w {};  

 

- txt 파일중에서 해당 문자열이 포함된 파일을 검색하여 출력

 

find . -type f -name *.txt -exec grep "찾을문자열" {} \; -print

 

- 인코딩 한번에 Find 를 사용하여 바꾸기  (링크)

 

http://mindpower.kr/22

 

- 특정 문자열이 포함된 라인을 검색하여 삭제(하위폴더 포함(

 

find . -type f -name "파일명" -exec vi -c "%g/찾을문자열/d" -c "wq" "{}" \;

 

※ 위 명령어를 보면 vi 로 열어서 해당문자열을 삭제한 후에 저장을 하니 검색조건에 맞는 모든 파일들의 Access 날짜가

    수정됩니다. 참고하세요~

 

- 하위폴더 검색하여 조건에 맞는 문자열 치환

find . -type f -name "*.*" -exec vi -c "%s/[찾을문자열]/[바꿀문자열]/g" -c "wq" "{}" \;

※ 문자열 중 / 와 같은 경우 명령어로 읽지 말고 문자로 읽도록 \ 를 붙여줘야 합니다.

예) http://www.mindpower.kr/1212 를 넣을경우 http:\/\/www.mindpower.kr\/1212

 

 

이상 마치도록 하겠습니다. 궁금한점이 있거나 하시면! 댓글이나 메일 다 환영합니다. ^^

 

Posted by 소울하트