Translate

[Linux/Unix] 많이 사용하지 않는 find 의 고급기능



파일을 찾을 때 find 명령어와 xargs 명령어를 파이프(|)로 묶어서 여러가지 기능을 사용을 했었는데 find 명령어에 대해서 자세히 찾아보니 다른 블로그에서 쉽게 보지 못했던 기능들이 있어서 정리를 해둔다.



find 는 기본적으로 다음의 방법으로 사용을 한다.


// 문법
$ find path operators


// 현재 디렉토리(하위포함 이후 표현 동일함)에서 이름이 *.c 에 해당하는 결과
$ find . -name *.c

// 루트(/) 디렉토리에서 최근 3일 이내에 수정된 자료의 결과
$ find / -mtime -3

// 사이즈가 512byte 보다 큰 결과
$ find . -size +512

// .o 로 끝나는 파일을 찾아서 모두 삭제
$ find . -name "*.o" -exec rm -rf {} \;

// [주의] !, \(, \), {} 를 비롯한 모든 연산자의 앞뒤에는 반드시 공백이 있어야 한다.
// 아래의 명령은 정상적으로 실행되지 않는다.
$ find . \!\(-atime +5 \(-name "*.o" -o -name "*.tmp"\)\)

// 현재 디렉토리에서 일반파일 유형만 검색
// b(블록특수파일), c(문자특수파일), d(디렉토리), f(일반파일), l(심볼릭링크), p(이름있는 파이프파일), s(소켓)
$ find . -type f







AND/OR/NOT 연산에 대해서 다음과 같이 사용이 가능하다.


 operator1 -a operator2  // AND 연산
 operator1 -o operator2  // OR 연산
 ! operator                   // NOT 연산
 \(expression\)            // 논리 우선순위 지정


// 파일이름이 *.o 또는(OR) *.tmp 와 일치하는 결과
$ find . -name "*.0" -o -name "*.tmp"

// 접근한지 5일이 넘었고 파일이름이 *.o 또는 *.tmp 와 일치하는 결과
$ find . -atime +5 \( -name "*.o" -o -name "*.tmp" \)

// [주의] 두 연산자 사이에 -o 가 없으면 AND로 간주 (아래의 두 명령은 같은의미)
$ find . -atime +5 -name "*.o" -o -name "*.tmp"
$ find . \( -atime +5 -name "*.o" \) -o -name "*.tmp"

// [공백주의](접근한지 5일이 넘었고 파일이름이 *.o 또는 *.tmp) 와 일치하지 않는 결과
$ find . \! \( -atime +5 \( -name "*.o" -o -name "*.tmp" \) \)






특정 디렉토리를 제외하고 검색하기


// -prune 옵션: find의 검색 작업을 현재 경로명에서 끊어주는 역할을 한다.


// 현재 디렉토리의 파일들 모두 찾기
1004lucifer:rabbit huhwook$ find .
.
./.DS_Store
./log
./log/nohup.out_bak
./sp
./sp/20150211.log
./sp/20150212.log
./sp/20150213.log
./sp/20150214.log
./sp/20150214_notNull.log
./sp/20150215.log
./sp/20150216.log
./sp/20150217.log
1004lucifer:rabbit huhwook$ 

// sp 단어의 디렉토리를 제외하고 찾기
1004lucifer:rabbit huhwook$ find . \! \( -type d -name sp -prune \)
.
./.DS_Store
./log
./log/nohup.out_bak
1004lucifer:rabbit huhwook$ 

// ./sp 경로의 디렉토리를 제외하고 찾기
1004lucifer:rabbit huhwook$ find . \! \( -type d -path ./sp -prune \)
.
./.DS_Store
./log
./log/nohup.out_bak
1004lucifer:rabbit huhwook$ 
1004lucifer:rabbit huhwook$ 

// ./sp 와 ./log 경로의 디렉토리를 제외하고 찾기
1004lucifer:rabbit huhwook$ find . \! \( \( -type d -path ./sp -o -type d -path ./log \) -prune \)
.
./.DS_Store
1004lucifer:rabbit huhwook$






검색 디렉토리 최대 레벨 제한 걸기


1004lucifer:rabbit huhwook$ ll
total 2483808
-rwxrwxrwx  1 huhwook  staff  1271705839  2 26 18:03 20150226_RabbitMQ_Access_Log.zip
drwxr-xr-x  5 huhwook  staff         170  2 26 18:24 rabbit
drwxr-xr-x  5 huhwook  staff         170  2 26 18:36 tomcat
1004lucifer:rabbit huhwook$ 
1004lucifer:rabbit huhwook$ find . -maxdepth 1
.
./.DS_Store
./20150226_RabbitMQ_Access_Log.zip
./rabbit
./tomcat
1004lucifer:rabbit huhwook$ 






특정 단어가 들어있는 파일을 찾는 방법


// 현재디렉토리의 일반파일에서 $12.99 라는 문자열이 있는 파일을 검색
$ find . -type f | xargs grep "$12.99"









참고서적

유닉스 파워 툴 - 8점
셸리 파워즈 지음, 서환수 옮김/한빛미디어


댓글