find

chris·2022년 12월 11일
0

shell script

목록 보기
2/3
post-thumbnail

find [option][path] [express]


find는 상황에 따라서 원하는 파일을 잘 검색할 수 있도록 다양한 옵션과 표현식을 제공한다. 그리고, 표현식을 어떻게 사용하느냐에 따라 필요한 파일을 쉽게 찾을 수 있다.

find 기본 사용법

$ find ./ -name success.log

위 예제는 현재 경로에서 success.log라는 파일을 찾는 예제이다.

$ find -L ./ -perm 644 -name 'rc.*'

파일 권한이 644이면서 rc로 시작하는 파일명을 가진 파일을 검색하는 예제이다.


find의 다향한 표현식

find는 조건으로 파일을 찾기 위한 방법으로 Option이 아닌 Expression으로 제공한다.
Expression에서는

  • find에서 찾고자 하는 파일의 속성을 정의할 수 있는 Test
  • Test와 Test의 검색 우선순위를 정의할 수 있는 Operation
  • 검색한 파일을 인수로 하여 또 다른 명령어를 실핼할 수 있는 Action
  • Test와 함께 쓰이면서 Test의 검색조건을 변경할 수 있는 Positional Options가 있다

Test

Test는 find에서 가장 많이 사용되는 표현식이다. Test에는 다음과 같이

  • 시간 관리 테스트
  • 최신 파일 검색 관련 테스트
  • 파일 권한 관련 테스트
  • 그룹 및 사용자 관련 테스트
  • 파일명 관련 테스트
  • 파일 경로 관련 테스트
  • 파일 타입 관련 테스트
  • 기타 테스트

시간 관련 테스트

시간 관련 테스트는 파일이 언제 생성되었고, 언제 사용되었으며, 언제 변경되었는지를 현재 시간 기준으로 명시된 분 또는 시간에 해당하는 파일을 찾아준다.

TestDescription
-amin N현재 시각을 기준으로 N분 전에 액세스된 파일을 찾아줌
-atime N현재 시각을 기준으로 N * 24시간 전에 액세스된 파일을 찾아줌
-cmin N현재 시각을 기준으로 N분 전에 이름이 변경된 파일을 찾아줌
-ctime N현재 시각을 기준으로 N * 24시간 전에 이름이 변경된 파일을 찾아줌
-mmin N현재 시각을 기준으로 N분 전에 내용이 수정된 파일을 찾아줌
-mtime N현재 시각을 기준으로 N * 24시간 전에 내용이 수정된 파일을 찾아줌
# 현재 Directory에서 24시간 전에 수정된 파일을 찾아서 삭제한다.
$ find ./ -mtime +0 -delete

최신 파일 검색 관련 테스트

명시한 파일 기준으로 더 최근에 접근하고, 수정 및 변경이 이루어진 파일을 검색해 준다.

TestDescription
-anewer FILE명시된 파일보다 최근에 Access한 파일을 찾아줌
-cnewer FILE명시된 파일보다 최근에 Change한 파일을 찾아줌
-newer FILE명시된 파일보다 최근에 Modify한 파일을 찾아줌
-newerXY FILE명시된 파일의 속성보다 수정된 파일을 찾아줌.
파일 속성은 XY로 표시하며, 다음과 같은 속성이 있으며 속성 B는 Linux에서 사용할 수 없음
a: 파일 참조의 액세스 시간,
B: 파일 참조의 탄생 시간,
c: inode 상태 변경 시간 참조,
m: 파일 참조의 수정 시간
# success.log 보다 더 최근에 수정된 파일을 검색
$ find ./ -anewer sucess.log

파일 궎나 관련 테스트

특정 권한이 부여된 파일을 검색할 수 있다. 예를 들어 소유자만 읽고, 쓸수 있는 파일을 검색하거나, 다른 사용자에게 실행 권한이 부여된 파일을 검색할 수 있다.

TestDescription
-perm MODE명시된 파일 권한과 동일한 파일을 검색
-perm -MODE명시된 파일 권한이 포함된 파일을 검색
-perm /MODE명시된 파일 권한을 소유자, 그룹, 기타로 구분하여 세 개의 권한 중 하나라도 동일한 파일을 검색
-readable로그인한 사용자가 읽을 수 있는 파일을 검색
-writable로그인한 사용자가 쓸 수 있는 파일을 검색
-executable실행 권한이 있는 파일만 검색
# 파일 권한 중 하나 이상이 6에 해당하는 파일 검색
$ find ./ -perm /666

그룹 및 사용자 관련 테스트

Group ID 또는 Group Name, User ID 또는 User Name에 해당하는 파일을 검색할 수 있다.

TestDescription
-gid N그룹ID가 명시한 그룹ID N과 동일한 파일 검색
-group GROUP-NAME그룹명이 명시한 그룹명 GROUP-NAME과 동일한 파일 검색
-nogroup존재하지 않은 그룹ID를 가지고 있는 파일 검색
-nouser존재하지 않은 사용자ID를 가지고 있는 파일 검색
-uid N사용자 ID가 명시한 사용자ID N과 동일한 파일 검색
-user USER-NAME사용자명이 명시한 사용자명 USER-NAME과 동일한 파일 검색
# 그룹소유권이 root인 파일 검색
$ find ./ -group root

파일명 관련 테스트

파일명을 이용하여 검색 할 때 대소문자 구분을 없앤다던가 하여 심볼릭 링크를 검색할 수 있다.

TestDescription
-iname PATTERN대소문자 구분없이 패턴과 일치하는 파일 검색
-inum N파일의 Inode 번호 N을 갖는 파일 검색
-lname PATTERN패턴과 일치한느 심볼릭 링크 검색
-name PATTERN패턴과 일치하는 파일 검색
-regex PATTERN패턴과 일치한느 경로 검색, Emacs 정규 표현식이 기본값이며, -regextype 옵션을 사용하여 변경할 수 있음
-iregex PATTERN대소문자 구분없이 패턴과 일치하는 경로 검색
-samefile NAME파일명과 동일한 파일 및 심볼릭 링크 검색, 심볼릭 링크 검색을 위해서는 -L 옵션을 함께 사용해야 함
# e로 시작하는 txt파일 검색
$ find ./ -iname 'e*.txt'

파일 경로 관련 테스트

현재 Directory를 기준으로 명시된 패턴에 의해 파일의 경로를 검색한다.

TestDescription
-ipath PATTERN대소문자 구분하지 않고 패턴과 일치하는 경로를 검색
-links NN개의 링크를 가지고 있는 경로를 검색
-path PATTERN패턴과 일치하는 경로를 검색
#f로 시작해 t로 끝나는 경로의 모든 파일 검색
$ find ./ -ipath './f*t'

기타 테스트

TestDescription
-empty파일 사이즈가 0인 파일을 검색
-size N[cwbkMG]명시한 파일 사이즈에 해당하는파일을 검색
b: 512byte block
c: byte
w: 2byte
k: kilo byte
M: mega byte
G: giga byte
-used N파일이 변경된 후 N일에 마지막으로 액세스한 파일을 검색
# 파일이 변경되고, 5일 안에 액세스한 파일 검색
$ find ./ -used 5

Operation

Operation은 위 테스트를 사용해 AND, OR, NOT과 같은 연산을 할 때 사용할 수 있다.

TestDescription
(expr)우선순위나 표현식을 그룹핑할 경우 사용되며 \와 함께 사용됨
!expr표현식의 반대 결과를 리턴함
-not expr!expr과 동일함
expr1 expr2AND 연산을 수행하며, expr1이 false이면 expr2는 평가되지 않음
expr1 -a expr2expr1 expr2와 동일함
expr1 -and expr2expr1 expr2와 동일하지만 POSIX 호화은 안됨
expr1 -o expr2OR 연산을 수행하며, expr1이 true이면 expr2는 평가되지 않음
expr1 -or expr2expr1 -o expr2와 동일하지만 POSIX 호환은 안됨
expr1, expr2expr1, expr2를 각각 수행되며, 결과는 expr2에 해당하는 것만 출력됨, 함께 출력을 하기 위해서는 -printf나 -fprintf를 함께 사용해야 함
# 파일명이 txt로 끝나지 않는 피일명 검색 
$ find ./ ! -name '*.txt'
$ find ./ -not -name '*.txt'

Action

Action은 단독으로 사용되기보다는 Test와 같은 표현식과 함께 사용된다. Action에는 Test와 같은 표현식을 통해 검새된 파일을 인자로 하여 또 다른 명령어를 실행해 주는 명령어 실행 관련 액션과 검색결과를 사용자의 입맛에 맞게 출력해 주는 결과 출력 관련 액션으로 나누어진다.

명령어 실행 관련 액션

ActionDescription
-delete
-exec COMMAND {};표현식에 의해 검색된 파일을 인수로 받아 -exec 다음의 명령어를 수행함,
인수로 받을 결과값은 중괄호{}로 표현되며
세미콜론;은 역슬래시\와함께 사용해야 함
-exec COMMAND {}+-exec와 동일하나 결과값을 연 이어서 보여줌
-execdir COMMAND {};-exec와 유사하지만 서브 이렉터리부터 검색하기 때문에 결과값은 파일명만 출력됨
-execdir COMMAND {}+-execdir과 동일하나 결과값을 연 이어서 보여줌
-ok COMMAND {};-exec와 유사하지만 사용자에게 실행 여부를 확인 후 실행함
-okdir COMMAND {};-execdir과 유사하지만 -ok와 같은 방식으로 사용자에게 실해 여부를 확인 후 실행함
-prune검색한 패턴이 디렉터리인 경우, 하위 디렉터리의 파일은 검색하지 않음
-quit-quit 앞에 만난 표현식에 해당하는 파일이 검색되면 검색을 종료함
# 검색된 파일 삭제
$ find ./ -name rootfile -delete

# 검색된 파일에서 grep을 이용해 다시 특정 문자열 검색
$ find ./ -name 'expression.txt' -exec grep CPU '{}' \;

결과 출력 관련 액션

OptionDescription
-fls file표현식에 의해 검색된 파일의 결과를 명시한 파일로 ls -l을 실행한 것과 유사한 결과를 저장함
-fprint file표현식에 의해 검색된 파일의 결과를 명시한 파일에 저장함
-fprint0 file표현식에 의해 검색된 파일의 결과를 명시한 파일에 뉴라인이나 공백없이 저장함
-fprintf format역슬래시\와 퍼센트%로 된 표준 출력 포맷에 맞게 검색된 파일 결과를 보여줌
-fprintf file format-printf와 비슷하지만 -fprintf와 같이 검색된 파일을 명시한 파일에 저장함
-ls표현식에 의해 검색된 파일의 결과를 ls -l을 실행한 것과 유사한 결과를 보여줌
-print;표현식에 의해 검색된 파일의 결과를 보여줌
-print0표현식에 의해 검색된 파일의 결과를 뉴라인 없이 보여줌
# f로 시작하는 파일을 헌번 더 ls -l한 결과를 파일에 저장
$ find ./ -name 'f*' -fls file.txt

Positional Operations

-daystart, -follow, -regextype을 제외한 모든 Positional Option 앞에 지정된 테스트를 포함하여 모든 테스트에 영향을 준다. 이는 명령줄을 구문 분석할 때 Positional Option이 치리되고 파일이 검사될 때까지 테스트는 수행되지 않기 때문이다.
반대로, -daystart, -follow, -regextype Positional Option은 명령 행에서 나중에 나타나는 테스트에만 영향을 미친다.

Positional OptionsDescription
-dFreeBSD, NetBSD, MacOS X 및 OpenBSD와의 호환성을 위한 -depth의 동의어
-depth서브 디렉터리의 파일을 먼저 검색함
-daystart24시간이 아닌 해당일을 기준으로 파일 검색, -amin, -atime, -cmin, -ctime, -mmin 및 -mtime과 함께 사용해야 함
-regextype type-regex나 -iregex의 정규식 구문을 변경함, 기본 유형은 emacs이며, posix-awk, posix-basic, posix-egrep 및 posix-extended가 있음
-maxdepth levels명시한 Level만큼 서브 디렉터리의 파일까지 검색함
-mindepth levels명시한 Level의 서브 디렉터리부터 파일을 검색함
# 현재 디렉터리부터 검색됨
$ find ./ -name 'P*'
# ./ptn
# ./ptn/ptn1.log
# ./ptn/ptn2.log
$ find ./ -depth -name 'p*'
# ./ptn/ptn1.log
# ./ptn/ptn2.log
# ./ptn

# 현재 시각 기준으로 24시간 안에 수정된 파일 검색
$ find ./ -ctime 0
# 현재 시각 기준으로 현재 날짜에 수정된 파일 검색
$ find ./ -daystart -ctime 0

# 명시된 깊이까지만 검색
$ find ./ -maxdepth 1 -name 'p*'
# ./ptn

# 명시된 깊이까지만 검색
$ find ./ -mindepth 2 -name 'p*'
# ./ptn/ptn1.log
# ./ptn/ptn2.log

find Options

find에서 제공하는 옵션에는 Symbolic link와 관련된 옵션, find가 어떻게 파일을 찾는지를 확인하고, find 기능을 디버깅하기 위한 디버그 관련 옵션과 디버그의 레벨을 설정할 수 있는 레벨 관련 옵션이 있다.

OptionsDescription
-P파일을 검샤할 때 파일이 Symbolic link인 경우,
Symbolic link 자체의 속성을 검사하며,
find의 기본 옵션에 따라서 옵션을 생략하면 -P 옵션으로 적용됨
-L파일을 검사할 때 파일이 Symbolic link인 경우,
Symbolic link에 연결된 파일의 속성을 검사하여,
검사되는 모든 파일 목록을 보여줌
-H파일을 검사할 때 파일이 Symbolic link인 경우,
Symbolic link의 속성을 검사하나,
명령 행에 지정된 파일이 Symbolic link인 경우,
Symbolic link에 연결된 파일의 속성을 검사함
$ find -P ./ -type f -name 'e*'
profile
software engineer

0개의 댓글