* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체
- 파일 이름에 foobar 가 들어간 파일 찾기
find / -name "foobar" -print
- 특정 사용자(foobar) 소유의 파일을 찾기
find / -user foobar -print | more
- 최근 하루동안에 변경된 파일을 찾기
find / -ctime -1 -a -type f | xargs ls -l | more
- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
find / -mtime +30 -print | more
- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt
- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
find . -prune ...
- 퍼미션이 777 인 파일 찾기
find / -perm 777 -print | xargs ls -l | more
- others 에게 쓰기(write) 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more
- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
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
- 빈 파일(크기가 0 인 파일) 찾기
find / -empty -print | more
또는
find / -size 0 -print | more
- 파일 크기가 100M 이상인 파일을 찾기
find / -size +102400k -print | xargs ls -hl
- 디렉터리만 찾기?
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
- *.bak 파일을 찾아 지우기
find / -name "*.bak" -exec rm -rf {} ;
- *.bak 파일을 찾아 특정 디렉터리로 옮기기
mv `find . -name "*.bak"` /home/bak/
- 여러개의 파일에서 특정 문자열을 바꾸기
find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} ;
- 특정 디렉토리 하위의 모든 파일을 뒤져서 특정 문자열이 들어 있는 파일 찾기
find . | xargs grep csh : .은 현재디렉토리 이므로 현재 디렉토리 하위의 모든 파일에서 csh글자를 grep
find /user/ | xargs grep csh 로 하면 당연 /user/ 아래의 모든 파일이 대상이 되겠져.
------------------------------------------
find 명령어는 파일 시스템에서 주어진 조건으로 파일을 찾을 때 아주 유용하게 쓰입니다. 대표적인 용도는 오래되거나 크거나, 사용하지 않는 파일들을 찾을 때 그 위력을 발휘합니다. 기본적인 사용 방법은 다음과 같습니다.
# find path operators
# find 대상디렉토리 검색조건 처리방법
검색종류 -name filename filename 파일 이름으로 찾는다.
-user username user이름으로 찾는다.
-group groupname group 이름으로 찾는다.
-perm nnn 파일 권한이 nnn인 파일을 찾는다. (ex. -perm 755)
-type x 파일 타입이 x인 파일들을 찾는다.
( f : 일반파일, b : 블록 특수파일, d: 디렉토리, l : 심볼릭 링크 등. )
-atime +n access time 이 n일 이전인 파일을 찾는다.
-atime -n access time이 n일 이내인 파일을 찾는다.
-mtime +n n일 이전에 변경된 파일을 찾는다.
-mtime -n n일 이내에 변경된 파일을 찾는다.
-size n 사이즈가 n이상인 파일들을 찾는다.
-links n 링크된 개수가 n인 파일들을 찾는다.
-print 표준출력
-exec command command 실행.
-operator -a and 연산, -o or 연산, ! not 연산, \( expression \)
몇가지 예를 들어 설명드리겠습니다.
$ find /home. -name ping -print
root 디렉토리 밑에서 파일이름이 ping인 파일을 찾아 절대 경로명을 화면에 출력한다.
$ find /home -name test* -print
/home 아래에서 파일이름이 test로 시작하는 모든 파일을 찾아서 화면에 보여줍니다.
$ find /home -name *.c -print
/home 밑에 이름이 .c로 끝나는 모든 파일들을 찾아 경로명을 보여준다.
$ find /home -name who.txt -print
home 디렉토리 아래에 who.txt라는 파일을 찾아 경로명을 보여준다.
$ find /home -name core -size +2048 -print
파일 이름이 core이고 크기가 2048블럭 이상인 파일을 찾아준다.
$ find /home -name core -exec ls -l {} \;
이름이 core인 파일을 찾아서 ls -l 한다.
$ find /home -name core -exec rm -i {} \;
현재 디렉토리 밑에서 이름이 core인 파일을 찾아 지운다(지우기 전에 정말 지울 지를 물어본다.)
$ find /home -user unix01 -print
파일 소유자가 unix01인 파일을 찾아준다.
$ find /home -group unix -print
사용자그룹이 unix인 파일을 찾아준다.
$ find /home -perm 700 -print
파일 권한이 700인 파일을 찾아준다.
$ find /home \ ( -perm 400 -o -perm 200 ) -print
파일 권한이 400인 파일과 200인 파일을 찾아준다. (주의 : “\”의 앞뒤에 space 가 반드시 있어야 한다.)
$ find /home -type d -print
파일 타입이 d인 파일을 찾아 경로명을 화면에 출력한다.
$ find /home -type c -print
/dev디렉토리 아래에서 파일 타입이 c인 파일을 찾아 경로명을 보여 준다.
$ find /home -atime +30 -print
30일 이전에 억세스되었던 파일을 찾는다.
$ find /home -mtime -7 -print
7일 이내에 수정된 적이 있는 파일을 찾는다.
$ find /home -size +1024 -print
파일의 블럭 크기가 1024 이상인 파일을 찾아준다.
$ find /home -name *.bak -exec rm -rf {} \;
파일 이름이 .bak 로 끝나는 파일을 찾아서 지운다.
$ find /home -name \*.c -atime +30 -exec ls -l {} \;
30일 이전에 억세스된 파일 중 *.c를 찾아 ls -l 한다.
■ find 명령과 관련된 기본적인 옵션 사항들
-------------------------------------------------------------------------------
식 값/동작
-------------------------------------------------------------------------------
-name pattern 화일의 이름이 pattern과 일치하면 참,
pattern은 셸 메타문자 *,[] ?를 포함할 수 있다.
-perm oct 화일의 허가 플래그의 8진수 표현이 oct와 일치하면 참
-type ch 화일의 유형이 ch(b=block, c=char등)이면 참
-user userId 화일의 소유자가 userId이면 참
-group groupId 화일의 그룹이 groupId이면 참
-atime count 화일이 count 날 수 이내에 접근되었으면 참
-mtime count 화일의 내용이 count 날 수 이내에 수정되었으면 참
-ctime count 화일의 내용이 count 날 수 이내에 수정되었고, 화일의 속성이 바뀌었으면 참
-exec cmd 수행중인 command의 종료 코드가 0이면 참. 명령은 \; 에 의해서 끝내야한다.
만일 {}를 명령의 인수로 지정하면, 현재 화일의 이름으로 치환
-print 현재 화일명을 프린트하고 참값을 반환
-ls 현재 화일의 속성을 보여주고 참값을 반환
-cpio device 현재 화일을 cpio 형식으로 device에 쓰고 참값을 반환
-!expression expression의 논리 부정을 반환
exp1 [-a] expr2 단축형 and: 만일 expr1이 거짓이면 거짓을 돌려주고, expr2는 수행하지 않고,
만일 expr1이 참이면 expr2의 값을 반환
expr1 -o expr2 단축형 or: 만일 expr1이 참이면 참을 반환.
만일 expr1ㅣ 거짓이면 expr2의 값을 반환
--------------------------------------------------------------------------------------------
■ find 동작 예시
--------------------------------------------------------------------------------------------
- [root@rootman /root]# find / -name "*.c" -print
: 최상위 디렉토리로 부터 모든 C 소스를 출력
- [root@rootman /root]# find / -mtime 5 -ls
: 최상위 디렉토리에서 5일동안 수정된 화일들을 표시
- [root@rootman /root]# find / -name "*.bak" -exec rm -f {} \; 2>/dev/null
: 최상위 디렉토리로부터 bak로 끝나는 화일들을 삭제처리함
- [root@rootman /root]# find / \(-name "*.c" -o -name "*.bak" \) -print
: 최상위 디렉토리에서 *.c 나 *bak 화일로 끝나는 모든 화일들의 이름을 출력
- [root@rootman /root]# find / -name "*.o" -o -name "*.tmp"
: 파일 이름이 *.o 또는 *.tmp 와 일치하는 파일들에 대해서 참으로 평가
- [root@rootman /root]# find / -type f -atime +30 -print
: 30일 이상 읽혀지지 않은 모든 파일들을 출력한다
- [root@rootman /root]# find / -atime +5 \( -name "*.o" -o -name "*.tmp" \)
: access 시간이 5일 이상이고 이름이 .o 나 .tmp 로 끝난다.
- [root@rootman /root]# find / ! -atime +5 \( -name "*.o" -o -name "*.tmp" \)
: 4번과의 반대로 의 결과를 얻는다.