오늘은 매번 미루다 리눅스에서 유용하게 쓰이는 find 명령어 에 대하여 정리하고자 합니다.
단어의 뜻에서 볼 수 있듯이 find 명령어는 무엇을 찾는데 주로 쓰이는 명령어 입니다.
하지만 단순히 찾는 것에서 끝나는 것이 아니라 find 명령어는 | 파이프 를 이용하여 리눅스 쉘 스크립트랑 섞어서 무궁무진한
작업을 편하게 해줄 수 있습니다.!
| 파이프를 이용하여 쉘 스크립트와 섞기 전 기초적인 find 명령어에 대하여 간단하게 정리하고자 합니다.
우선 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 명령과 옵션의 조합을 정리하였습니다. 유용하게 사용하시길 바랍니다. 후후
find . -uid 591 -exec chown apache:apache {} \;
우선 위 내용을 간단하게 설명하자면!
find : 찾기 명령
. : 은 현재 디렉 아래로
-uid : UID 패턴검색옵션
591 : UID 값이 591인 파일 찾기
-exec : 실행하라 는 명령어
chown apache:apache : 실행할 명령
{} : find 로 검색하여 나온 결과값을 exec 로 실행한 명령어의 대상으로
\; : find 에서 -exec 옵션으로 실행할 명령의 끝을 나타냄
find / ( -nouser -o -nogroup ) -print | more
find / -size +800k -exec rm -rf {} \;
정규표현식은 다음포스팅에서 다루도록 하겠습니다.
find / -name '[a,b][c,d]* -print
- 일반사용자에게 쓰기권한(rwx---rwx)이 있는 파일을 찾아서 실행 권한을 삭제 (단, ! 을 사용하여 링크 파일은 제외함)
find / -perm +2 ! -type l -print -exec chmod o-w {};
find . -type f -name *.txt -exec grep "찾을문자열" {} \; -print
- 특정 문자열이 포함된 라인을 검색하여 삭제(하위폴더 포함(
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
이상 마치도록 하겠습니다. 궁금한점이 있거나 하시면! 댓글이나 메일 다 환영합니다. ^^
'시스템 > Linux' 카테고리의 다른 글
SSH 암호없이 접속(SSH-KEYGEN) (0) | 2012.11.13 |
---|---|
리눅스 명령어 - ac (0) | 2012.07.11 |
리눅스 명령어 - ab (0) | 2012.07.05 |
리눅스 명령어 - a2p (0) | 2012.07.04 |
인코딩 변경(인코딩 한번에 변경) (0) | 2012.03.22 |
make: *** [ext/mysqli/mysqli_api.lo] Error 1 (0) | 2012.03.15 |
vsftpd 설치와 옵션(Cent OS) (0) | 2012.01.16 |
Apache conf 파일 분석 ( 2.2.x 이하 apache ) (0) | 2012.01.16 |