본문 바로가기
OS/Linux

[Linux/Unix] find 의 고급기능

by 신군. 2022. 1. 8.
반응형

파일을 찾을 때 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"

반응형

'OS > Linux' 카테고리의 다른 글

[Linux] CentOS 8: Failed to download metadata for repo 'appstream'  (0) 2022.04.23
디렉토리 일괄변경  (0) 2022.02.21
exec와 xargs 차이  (0) 2022.01.08
centos8 docker install  (0) 2020.08.31
How to Install Java on Linux Mint 19  (0) 2020.01.11