find / -size +2000M -exec ls -lh {} \;
특정 용량 이상의 파일 검색
2G 이상을 검색할때...
------------------------------------------------------------------------
출처 :: http://blog.naver.com/youngrimi?Redirect=Log&logNo=50112013269
find
윈도우의 검색과 비슷한 기능으로 단순히 파일을 찾는 역할만 하는 것이 아니라 찾은 파일에 대하여 특정 작업까지도 할 수 있다.
파일을 찾을때도 많은 옵션으로 다양한 방법이 제공된다
사용형식
find [대상경로] [OPTIONS] [ACTIONS]
대상경로(PATH)
경로지정방법 |
검색대성범위 |
지정 예 |
. |
현재 디렉토리 이하 |
. |
/ |
시스템전체 |
/ |
~ID |
계정사용자의 홈디렉토리이하 |
~user1 |
/경로 |
/ 경로 디렉토리이하 |
/etc , /usr/local |
검색옵션(OPTION)
검색옵션 |
의 미 |
-empty |
비어있는 파일 (단, 일반파일 또는 일반 디렉토리에 한함) |
-uid n |
지정된 n 값의 UID를 갖는 파일 |
-gid n |
지정된 n 값의 GID를 갖는 파일 |
-group 그룹명 |
지정한 그룹명에 소속된 파일 |
-name |
지정된 형식의 패턴을 가지는 파일 |
-newer 파일 |
지정한 '파일' 보다 더 최근에 변경된 적이 있는 파일 |
-used n |
파일이 변경된 이후 최근 n일 이후에 액세스된 적이 있는 파일 |
-user uname |
지정한 uname의 소유로 된 모든 파일. (UID로 지정가능) |
-admin n |
최근 n 분 이전에 엑세스(access) 된 적이 있는 파일 |
-anewer 파일 |
지정한 '파일' 보다 더 최근에 엑세스 된 적이 있는 파일 |
-atime n |
최근 n*24시간 전에 엑세스 된 적이 있는 파일 |
-mmin n |
최근 n 분 이전에 변경된 적이 있는 파일 |
-mtime n |
최근 n*24시간 이전에 변경된 적이 있는 파일 |
-executable |
실행 가능한 파일 |
-readable |
읽기 가능한 파일 |
-writable |
쓰기 가능한 파일 |
-fstype type |
지정한 파일시스템타입(type)에 존재하는 파일 |
-nogroup |
소속그룹이 존재하지 않는 파일 |
-nouser |
소속 사용자(ID)가 존재하지 않는 파일 |
-path 패턴 |
파일명이 '패턴'에 매칭되는 파일 |
-perm 모드 |
'모드'에서 지정된 퍼미션과 일치하는 퍼미션을 가진 파일만 해당됨. 주의할 것은 정확하게 일치해야 한다는 점. 예를 들어 '-perm g=w'로 지정했을 경우에는 퍼미션이 0020인 것만 해당됨. |
-perm -mode |
'모드'에서 지정된 퍼미션을 가진 모든 파일. 예를 들어 '-perm -g=w'로 지정되었다면 그룹소유자에 w 퍼미션(쓰기권한)이 있는 모든 파일이 이에 해당됨. |
-regex 패턴 |
'패턴' 에서 지정한 정규표현식에 매칭되는 파일 |
-size n[cwbkMG] |
지정된 n 단위의 디스크공간을 사용하는 파일. 여기에는 b(디폴트), c, w, k, M, G 등이 올수 있음 |
-type 타입 |
지정한 파일타입에 해당하는 파일. b, c, d, p, f, l, s등이 있음. |
+n 은 n 보다 큰 값을 의미하고, -n 은 n 값보다 작은 값을 의마하며, n은 정확하게 n 값만을 의미한다.
검색 후 수행작업(ACTION)
ACTION |
수 행 내 용 |
-delete |
검색된 파일들을 삭제 |
-exec command ; |
지정한 command 를 실행 |
-exec command {} + |
검색된 파일들을 차례대로 매칭하면서 지정된 command를 수행 |
-ls |
'ls - dils'를 수행 |
-ok command ; |
-exec와 같지만 실행하기 전에 먼저 사용자에게 표준입력으로 수행할 command를 입력 받는다. 만약 입력이 없다면 지정된 command를 수행한다. |
-print |
검색된 파일들에 대하여 전체파일 경로로 파일리스트를 표준출력으로 출력한다. |
-printf format |
검색된 파일들에 대하여 지정된 format 형식으로 표준출력으로 출력 |
연산자(OPERATORS)
연산자 |
의 미 |
( ) |
괄호 안의 연산이 먼저 행해짐 |
! expr |
expr 이 거짓일 때 참. 참일 때 거짓이 됨. |
-not expr |
위의 '! expr' 과 동일함. (POSIX 호환용) |
expr1 expr2 |
AND 의 의미. expr1의 거짓일 때에는 expr2는 평가되지 않음 |
expr1 -a expr2 |
'expr1 expr2' 와 같음 |
expr1 -and expr2 |
'expr1 expr2' 와 같음 (POSIX 호환용) |
expr1 -o expr2 |
OR의 의미. expr1이 참일 경우 expr2는 평가되지 않음 |
expr1 -or expr2 |
'expr1 -o expr2' 와 같은 의미 (POSIX 호환용은 아님) |
보다 다양하고 복잡한 find 명령문을 만들어 찾고자 하는 파일이나 디렉토리를 보다 정확하게 검색하는데 사용
1. find의 파일검색 기본사용법
find / -empry -exec ls -l {} \;
시스템 전체에서 용량이 0인 비어있는 파일을 검색하여 ls -l 형식으로 {} 차례대로 치환하여 출력한다.
find / -uid 500 -exec ls -l {} \;
uid가 500인 사용자인 모든 파일을 찾아서 ls -l로 화면 출력
find / -user localhost -print
ID를 지정하여 그 사용자의 ID 소유로 된 파일들을 검색하는 예
리눅스 시스템내에 존재하는 localhost 소유의 모든 파일을 검색
-exec ls -l {} \;와 -print의 차이점은 -print는 검색결과를 파일의 절대경로로 표시하는 반면, -exec ls -l {} \;는 ls -l 과 같은 형식으로 검색결과를 표시한다.
find /home/localhost -name *.dat -exec ls -l {} \;
/(시스템전체)가 아닌 특정 사용자의 홈디렉토리내에서 특정 파일을 검색한 예
홈디렉토리 이하에 존재하는 모든 *.dat을 찾기
find ~young -name *.dat -exec ls -l {} \;
young 이라는 사용자의 홈디렉토리를 모를 경우 ~young 지정
~young 는 /etc/passwd 파일에 존재하는 young라는 사용자의 홈디렉토리위치를 의미
2. 검색된 파일을 바로 삭제
사용형식 : find 삭제할 경로 -name 파일정규식 -exec rm -f {} \;
young 라는 계정사용자의 홈디렉토리내에 존재하는 *.bak 파일을 찾아서 모두 삭제하는 예
* 백업 이라고 해서 .bak의 형태가 아닐수 있음
find ~young -name *.bak -exec ls -l {} \;
파일의 존재를 우선 확인한다.
find ~young -name *.bak -exec rm -f {} \;
rm -f 명령어를 실행하여 삭제한다.
rm -f /home/young/*****.bak
rm -f /home/young/********.bak
위의 명령어가 차례대로 실행되는 것과 같은 것이다.
삭제를 하려면 정말로 서버내부에서 불필요한 파일들인가를 반드시 확인한 후에 사용해야하고 가능하다면 경로를 전체경로 하는 것은 삼가해야 한다.
리눅스시스템내에 존재하는 불필요한 파일들
*.bak 백업파일, *.old, *.org, *orig 등의 작업 전 복사본, 서버장애의 원인을 발생할 수 있는 웹로그파일
APACHE 웹서버에 설정된 가상호스트들이 모두 동일한 access_log 파일을 가지는 경우도 있겠지만, 대부분의 가상 호스트들은 자기 자신의 홈페이지 디렉토리에 별도로 저장되는 경우가 일반적이다.
find / -name access_log -exec rm -f {} \;
find /home -name *.bak -exec rm -f {} \;
find /home -name error_log -exec rm -f {} \;
서버전체를 대상으로 access_log 파일을 찾아서 rm -f 실행한 것
아파치의 기본 설정은 access_log 파일이나 error_log 파일이 존재하지 않을 경우에는 자동으로 파일을 생성하게 되므로 삭제한 후에도 아파치는 정상 작동 한다. 하지만 로그 파일을 저장하는 디렉토리는 반드시 존재해야 아파치가 정상 작동된다.
3. 파일용량이 큰 파일들을 모두 검색하여 처리하기
find / -size +100M -exec ls -lh {} \;
h(human-readable) 파일을 리스팅할 때에 용량단위 (kilo, mega, giga)를 붙여서 출력한다.

4. 지정한 퍼미션을 가지고 있는 파일 검색하기
find / -perm 4755 -exec ls -l {} \;
SetUID 퍼미션과 755라는 퍼미션을 가진 파일을 찾은 예
(4000 setuid - 소유자 권한, 2000 setgid - 그룹권한)

5. 파일의 변경시간을 기준으로 원하는 파일 검색하기
최근 몇분, 몇 시간 이전 또는 이후에 사용되거나 변경된 적이 있는 파일을 검색할수 있다.
find /home/young -mmin 5 -exec ls -l {} \;
-mmin n , 정확하게 n을 의미 (+n n보다 큰값을 의미, -n n보다 작은 값을 의미)
find /home/young -atime -100 -exec ls -l {} \;
-atime -100 : 최근 100 시간 이내에 액세스된 적이 있는 파일을 검색한다.
find /home/young -mtime -1 -exec ls -l {} \;
-mtime -1 : 최근 1 시간 이내에 변경된 적이 있는 파일을 검색한다.
6. 지정한 파일보다 더 최근에 사용된 적이 있거나 변경된 적이 있는 파일 검색
find /home -anewer /home/young/begin -exec ls -l {} \;
/home/young/begin 파일 보다 더 최근에 액세스 된 적이 있는 파일들을 찾아서 보여준다.
특정파일을 지정해야 한다.
find /home -newer /home/young/begin -exec ls -l {} \;
/home/young/begin 파일이 변경된 것 보다 더 최근에 변경된 적이 있는 파일을 찾아서 보여준다.
7. 읽기 또는 실행, 쓰기가능한 파일을 검색하기
-executable : 실행 가능한 파일을 검색한다.
-readable : 읽기 가능한 파일을 검색한다.
-writable : 쓰기 가능한 파일을 검색한다.
find /home/young -executable -print
find /home /user -executable \! -writable -print
실행은 가능하지만 쓰지 못하는 파일을 대상으로 검색
8. 특정 파일타입의 파일들만 검색하기
파일종류를 지정하는 방법
-type b : 블록장치 파일 (block special file)
-type c : 문자블록장치 파일 (character special file)
-type d : 디렉토리 (directory)
-type p : FIFO 파일 (first in first out)
-type f : 일반파일 (regular file)
-type l : 심볼릭 링크파일 (symbolic link file)
-type s : 소켓파일 (socket file)
find /dev -type b -exec ls -l {} \;

블록장치파일
find /dev -type c -exec ls -l {} \;

문자장치파일
find /etc -type d -print 디렉토리
find /etc -type f -print 일반파일
find /etc -type l -exec ls -l {} \; 링크파일
find /tmp -type c -exec ls -l {} \; 소켓파일
9. root 소유의 SetUID, SetGID, StickyBit 파일을 검색하기
root 소유의 SetUID 파일들은 시스템에서 특별관리대상이기 때문에 어떤파일이 설정되어 있는가를 파악하고 별도 관리해야한다. find를 이용하여 root 소유의 SetUID파일을 검색할 줄 알아야 한다.

find / -user root -perm 4755 -exec ls -l {} \;
find / -user root -a -perm 4755 -exec ls -l {} \;
find / -user root -and -perm 4755 -exec ls -l {} \;
위의 방식은 모두 -user root와 -perm 4755는 AND조건
OR 연산 검색
find / -user root -o -perm 4755 -exec ls -l {} \;
find / -user root -or -perm 4755 -exec ls -l {} \;
10. 시스템 보안점검시 반드시 검색해야 하는 몇가지 find 검색방법
.rhosts , .bash_history , 무적파일(소유자가 없는 파일)
1. .rhosts 파일 검색
.rhosts 파일은 외부에서 아무런 제한 없이 로그인할 수 있는 접근허용이 설정된 파일
따라서 이 파일이 존재한다면 반다시 그 내용을 확인해 보아야 한다.
find / -name .rhosts -exec ls -l {} \;

만약 이파일이 존재한다면 그 용도와 사용목적을 학인해야 한다. 최근에 .rhosts파일을 사용하는 경우가 드물기 때문에 이 파일이 존재한다면 정상적인 사용이 아닐 가능성이 매우 높다
2. .bash_history
.bash_history 파일은 root를 포함하여 각 사용자들의홈디렉토리에 존재하는 파일로서 각 사용자들이 사용했던 명령어가 저장되어있는 매우 중요한 파일이다. 만약 이파일들 중 파일용향이 0인 파일이 있다면 해킹가능성을 의심해 보아야한다. 특히 root 소유의 bash_history 파일의 용량이 0이라면 매우 심각한 경우로서 99% 이상은 시스템이 해킹되었다고보아야 한다.
find / -name .bash_history -exec ls -hl {} \;

3. 무적파일(소유자가 없는 파일)
무적파일이란 소유자 또는 소유그룹이 존재하지 않는 파일을 의미하며 시스템 보안관리에 매우 중요하다. 리눅스는 멀티유저 운영체제이기 때문에 존재 하는 모든 파일과 디렉토리, 심지어 모든 장치들은 소유자나 소유그룹이 존재하기 마련이다. 따라서 소유자나 또는 소유그룹이 존재하지 않는 파일이나 디렉토리 혹은 장치파일등이 있다면 반드시 그 소속과 생성경위를 확인하여야 한다. 간혹 해킹된 시스템에서 무적파일이 생성되어 있는 경우가 매우 흔하기 때문이다.
find / -nouser -o -nogroup -exec ls -l {} \;

11. 지정한 문자열을 가지고 있는 파일 검색하기
윈도우의 검색 유틸리티 처럼 리눅스에서도 find 명령어를 이용하여 특정문자가 속한 파일을 찾을 수 있다.
형식 : find 대상 -type f -exec egrep -i "포함하는문자" /dev/null {} \;
파일종류를 지정하는 방법
-type b : 블록장치 파일 (block special file)
-type c : 문자블록장치 파일 (character special file)
-type d : 디렉토리 (directory)
-type p : FIFO 파일 (first in first out)
-type f : 일반파일 (regular file)
-type l : 심볼릭 링크파일 (symbolic link file)
-type s : 소켓파일 (socket file)