리눅스 find 명령어 예제

리눅스 find 명령어 예제

find는 파일을 찾을때 뿐만 아니라 다양한 조건으로 파일을 컨트롤 할 수 있는 기능을 합니다.

형식 : find <경로> <연산자>

경로 : find가 파일을 찾을 처음 위치를 지정한다. 예을 들어 ‘/’는 /(root)부터 찾고, ‘.’은 현재 디렉토리 부터 찾는다.
-name : 확장자가 txt 인 화일을 찾는다.

find / -name ‘*.txt’
-perm : 퍼미션이 666(-rw-rw-rw-)인 화일을 찾는다.

find . -perm 666
-type : 파일의 타입을 지정하여, 찾고자하는 파일을 찾는다.

타입의 종류는 다음과 같다.

b : 블록 특수 파일(block device)

c : 캐릭터 특수 파일 (character deice)

d : 디렉토리(directory)

f : 일반파일(file)

l : 심볼릭 링크(link)

p : 파이프 (pipe)

s : 소켓 (socket)
현재 디렉토리 아래에 있는 서브디렉토리를 모두 찾는다.

find . -type d
-atime ?n/n : 최근 n일 이전에 액세스된 파일을 찾아준다.(accessed time)

+n은 n일 또는 그보다 더 오래 전의 파일

-n은 오늘 부터 n일 전까지의 파일

n은 정확히 n일 전에 액세스되었음을 의미한다.
시스템 전체에서 한 달 또는 그 이상의 기간동안 한번도 액세스하지 않은 디렉토리

find / -atime +30 -type d
ctime ?n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time)

+n은 n일 또는 그보다 더 오래 전의 파일

-n은 오늘 부터 n일 전까지의 파일

n은 정확히 n일 전에 수정되었음을 의미한다.

현재 디렉토리 아래에서 최근 일주일 동안 고친 파일

find . -ctime -7
-mtime ?n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)

+n은 n일 또는 그보다 더 오래 전의 파일

-n은 오늘 부터 n일 전까지의 파일

n은 정확히 n일 전에 수정되었음을 의미한다.

-cnewer 파일명 : ‘파일명’ 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾아준다.
test.txt 화일이 생성된 이후의 화일을 찾는다.

find . -cnewer test.txt -print
-user 유저네임 : ‘유저네임’ 부분에 지정한 유저 소유의 파일을 찾아준다.
nalabi 라는 계정의 화일을 찾아준다.

find / -user nalabi
그외 자주 쓰이지 않지만 추가 옵션으로는 아래와 같다.
-maxdepth n

0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, ‘-maxdepth 1’은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다. -mindepth 옵션은 반대로 동작한다. 즉, 지정한 숫자만큼의 깊이부터 그 하위 디렉토리를 검색한다. (GNU find 버전)
-follow

심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.
-mount

현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.

test에는 다음과 같은 방법들이 있으며, test에 사용하는 인수에는 보다 큰 수를 의미하는 `’나, 보다 작은 수를 의미하는 `’를 함께 사용할 수 있다. 인수에 아무 연산자가 없을 경우에는 정확히 그 인수 값을 의미한다.
-group

특정 그룹 소유의 파일들을 찾을 경우에 사용한다.
-nouser

소유자가 없는 파일을 찾을 경우에 사용한다. 즉, /etc/passwd 파일에 없는 소유자의 파일을 찾을 경우에 사용한다.
-nogroup

올바른 그룹의 소유가 아닌 파일을 찾을 경우에 사용한다. 즉, /etc/groups 파일에 없는 그룹의 소유인 파일을 찾을 경우에 사용한다.
newer file1 file2

`file1′ 보다는 이후에 `file2′ 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.
-size n[bckw]

크기가 n 유닛(unit)인 파일을 찾을 경우에 사용한다. 유닛은 기본 설정(`b”와 함께 사용한 경우와 동일)인 512 바이트의 블럭, `c’를 사용할 경우에는 1 바이트, `k’를 사용할 경우에는 킬로바이트, `w’를 사용할 경우에는 2 바이트의 워드 크기를 나타낸다.
-empty

비어있는 파일이나 디렉토리를 찾을 경우에 사용한다. (GNU find 버전)
-regex

정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex’는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)

action은 test에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.
-print

찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.
-fprint file

찾은 파일들을 `file’로 출력한다. `file’이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어진다. (GNU find 버전)
-exec

파일을 찾았을 경우, 찾은 파일들에 대해 특정 명령을 수행 할 때 사용한다. 일반적으로 `-exec command {} ;’의 형식을 취한다.
-ok

-exec와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.
-ls

`ls -dils’ 형식으로 찾은 파일들의 정보를 출력할때 사용한다.
-fls file

`ls’와 동일하게 동작하며 결과를 `file’로 출력한다.

 

operator는 test에서 사용한 옵션들을 조합하여 조건식을 만들고자 할때 사용는 것으로 다음과 같은 방법들이 있다. (설명 순서는 우선순위(precedence)에 따른다.)

find 명령어로 일정기간, 특정용량 파일 삭제 및 찾기
*  일정기간 지난 파일 삭제 명령 – 7일 지난 파일 삭제 예

find [디렉토리] -ctime +7 -exec rm -f {} \;
* 특정용량 이상되는 파일 찾기 – 10MB 이상 되는 파일 찾기 예

find [디렉토리] -size +1000k -exec ls -al {} \;
*  생산된지 30일 이상 된 파일만 삭제

find [디렉토리] -type f -ctime +30 -exec rm -rf {} \;
*  생산된지 30일 이상 된 비어있는 디렉토리만 삭제

find [디렉토리] -empty -type d -ctime +30 -exec rmdir {} \;

※ 리눅스 버전에 따라 -ctime 이 먹지 않는 경우가 있다. 이때는 -mtime 으로 대체한다 (의미는 다르지만….)
*  현재 디렉토리( . ) 이하에 확장자가 .html ( -name “*.html” ) 인 파일만 ( -type -f )

find . -name “*.html” -type f -ls
* 현재 디렉토리 이하에서 확장자가 .php 인 파일만 삭제하기

find . -name ‘*.php’ -exec rm -f {} \;
* 파일크기가 300KB 이상 ( -size +300k ) 인 파일만 (호스팅 되는 홈피내에 큰 사이트의 파일이 있는지 찾을 때 유용)

find . -size +300k -ls
* 파일크기가 500bytes 이하 ( -size -500c )인 파일만

find . -size -500c -ls
* 수정한지 20일 이상 ( -mtime +20 ) 된 파일과 디렉토리

find . -mtime +20 -ls
* 수정한지 20일 이상된 파일만

find . -mtime +20 -type f -ls
* 수정한지 20일 이상된 파일만 삭제 ( -exec rm {} \; ) ( 정기적으로 20일지 지난 파일을 삭제할 때 유용 )

find . -mtime +20 -type f -ls -exec rm {} \;
* 수정한지 3일 이내 ( -mtime -3 ) 의 파일만 ( 백업할 때 유용 )

find . -mtime -3 -type f -ls
* 수정한지 30분 이내 ( -mmin -30 ) 의 파일만

find . -mmin -30 -type -f -ls