[Linux]

[Linux] 파일 찾기(find)

Jarvis2304 2022. 9. 2. 09:03

 

▶ find [옵션1] [경로] [옵션2][검사식][동작]...                                                                                                                                                            표현식↑

 

명령옵션: 명령 전체에 영향을 미치는 옵션

경로: 검색을 시작할 루트 디렉터리 경로(생략시 현재 디렉터리에서 검색)

표현식(expression): 검색 대상에 적용될 연산 및 동작을 기술(생략시 기본동작은 -print(표준출력))

 

-파일 검색 명령어

-파일명, 파일유형, 소유자, 시간 등을 기준으로 검색

-검색된 명령어에 대해 추가적인 명령 수행 가능

-Linux의 표준 명령 구문과 다른 구문을 사용

-지정한 경로를 시작으로 모든 하위 디렉터리 항목(파일,디렉터리)를 검색

 

[명령옵션1]

 

-심볼릭 링크 처리옵션

-P :기본, 검색 대상 파일이 심볼릭 링크일 경우, 원본을 대상으로 하지않고 링크 자체를 대상

-L :심볼릭 링크가 가리키는 원본을 검색대상으로 함

-H :명령인자로 지정한 심볼릭 링크만 원본을 대상으로 하고 나머지 심볼릭 링크는 -P와 동일

 

-기타옵션

-D 디버깅수준 :진단 정보를 출력, help,tree,stat,opt,rates

-O 최적화수준: 질의 최적화, -O0 -O1 -O2, -O3

 

[검사식]

[이름으로 항목(파일/디렉터리) 찾기]

-검사식: -name 패턴 또는 iname 패턴

-현재 파일의 base이름이 패턴과 일치하면 True

패턴에 와일드카드문자를 사용하여 형태를 지정

 

ex)

$ find -name "*java"

$ find /home/mylinux -name "[a-z]*?"

$ find /user/src /user/local/src -name "*.h" -print

$ find /home/mylinux –name *.java –print

$ find /usr /home /tmp –name “*.jar” 2> /dev/null

 

 

[동작]

-검색된 항목에 대해 수행될 동작을 지정

-동작이 생략되면 기본으로 -print를 수행, 항상 Ture 반환

-print0 :-print와 동일하나 줄바꿈 문자 대신 공백

-fprint 파일명, -fprint0 파일명 :print, print0와 동일하나 지정한 파일에 출력

 

-exec 명령 \;

지정한 Linux명령어 수행, 수행 결과0이 반환되면 True, 검색된 항목을 명령 인자로 전달하는 방법은{ }

 

ex)

$find -name "*,java" -exec ls -l { } \;

$ find /home/mylinux –name “[a-z]*?” -exec rm -f { } \;

$ find /usr /home /tmp –name “*.mp4” -exec du -s { } \; 2> dev/null

 

 

-ok 명령 \; :exec와 동일하나 연산을 수행 때마다 매번 확인

-ls :'ls -dils *' 명령과 같은 형식으로 출력

-fls 파일명 :-ls와 같은 결과를 지정파일에 저장

-delete :파일 또는 빈 디렉터리 삭제, 삭제 성공하면 True (-depth옵션 자동적용)

-prune :검색 항목이 디렉터리인 경우, 그 내부는 탐색하지 않음, 항상 True

-quit :즉시중지

ex) $ find -name "a.out" -exec ls -l {} \; -quit

 

 

 

[검사식]

- 파일유형에 따른 검색

현재 파일이 지정한 유형일 경우 true

 

[지정한 가능한 유형의 종류]

-type [파일유형]

f :일반파일 d:디렉터리 p:파이프 s:소켓

b :블록파일 c:문자장치 l: 소프트 링크

 

ex)

$ find . –type d

$ find . –type d –name “t*” -exec ls –l { } \;

$ find . –type l –print

$ find /dev –type b –name “s*” –exec ls –l { } \; 2> /dev/null

$ find /home/mylinux –type f –name “*.out” -prinf

 

- 시간에 따른 검색

-mtime | -atime | -ctime [옵션]

-mmin | -amin | -cmin [옵션]

-mtime :파일의 데이터가 마지막으로 수정(modify)된 시간

-atime :파일을 읽기 또는 접근(access)한 시간

-ctime :파일의 속성이 변경(change)된 시간

 

[옵션]

N :정확히 N인 시간

-N :N이하인 시간

+N :N이상인 시간

시간은 현재 시간을 기준으로 지난 24시간을 나눴을 때 몫

ex)

$ find . -mtime 0 :24시간 이내의 시간에 수정된 파일 찾기

$ find . –atime 1 :24시간에서 48시간 사이에 접근한 파일 찾기

$ find . –ctime -2 :48시간 이내의 시간에 변경된 파일 찾기

$ find . –mtime +1 :24시간보다 더 이전에 수정된 파일 찾기

$ find . –mtime +1 –mtime -4 :24시간보다 크고 96시간이내 시간에 수정된 파일

 

시간관련 옵션

-daystart :오늘 0시를 기준으로 시간 적용, 항상 true

$ find . –daystart –mtime 0 # 오늘 수정된 파일 찾기

$ find . –daystart -mtime 1 # 하루 전날 수정된 파일 찾기

$ find . –daystart –mtime 2 –ctime 1 # 이틀 전날 수정되고 하루 전날 변경된 파일

※이 옵션 뒤에 나오는 표현식에만 영향을 줌※

ex) $ find . –mtime 1 –daystart # 현재 시간을 기준으로 24~48시간에 수정된 파일

 

 

 

 

- 파일 기준 검색

-newer 파일명 | -anewer 파일명 | -cnewer 파일명

-지정된 파일보다 더 최근에 수정/접근/속성변경된 파일 검색

ex) $ find -newer hello.c -exec ls -l { } \

 

 

 

 

- 크기에 따른 검색

-size 크기

크기: [+ | - ]N[bcwkMG]

N, +N ,-N : 시간에 따른 검색과 동일 의미

b: 블록(기본), c: 바이트, w: 워드(2바이트), k: 킬로바이트, M: 메가바이트, G: 기가바이트

 

-empty

현재 파일의 크기가 0일 때 True

 

ex)

$ find / -size +5000c 2> /dev/null

$ find / -type f –size 0 –exec rm –f { } \;

$ find / -empty –exec rm –f { } \;

 

 

 

- 권한에 따른 검색

-현재 파일에 대한 읽기, 쓰기, 실행 권한 여부에 따라 true/false 결정

 

-readable :읽기 가능 접근권한이 있을 때 True

-writeable :쓰기 가능 접근권환이 있을 때 True

-executable :실행 가능 접근 권환이 있을 때 True

 

 

-perm [-|/]권한

-권한 앞에 지시어가 없는 경우(정확히 지정한 권한을 의미)

ex) $ find . –type f –perm a=rwx –exec ls –l { } \;

 

-권한 앞에 ‘-’인 경우: 지정한 권한이 모두 설정된 파일

ex) find . –type f –perm -ug=rx –exec ls –l { } \;

 

-권한 앞에 ‘/’인 경우: 지정한 권한이 하나라도 설정된 파일

ex) $ find . –type f –perm /go=rx –exec ls –l {} \;

 

 

 

- 소유권에 따른 검색

사용자 검사: -user 사용자명, -uid 사용자ID

ex)

# find / –type f –user baduser –exec ls –l {} \;

# find / -name “*rc” –uid 500 –exec ls –ld {} \;

그룹 검사: -group 그룹명, -gid 그룹ID

ex)

# find / –type f –group users –exec ls –l {} \;

# find / -type d -gid 100 –exec ls –ld {} \;

 

사용자나 그룹이 없는 파일: -nouser, -nogroup

# find / –nouser –exec ls –ld {} \; 2> /dev/null

# find / -nogroup –exec ls –ld {} \; 2> /dev/null

 

 

- 기타 검사식

-samefile 파일명 : 대상파일이 지정한 파일의 inode와 같은 동일 파일일 경우

-path 패턴, -ipath패턴 :대상 파일의 전체 경로명이 지정한 패턴과 일치할 경우

 

[파일 항목의 평가]

- 검색대상 항목인 파일/디렉터리 하나에 대해 표현식을 실행

-표현식에 나열된 표현식 항목을 우선순위에 따라 왼쪽에서 오른쪽으로 하나씩 평가

-표현식에 나열된 '옵션', '검사식' '동작'들은 각각의 탐색 항목에 대해 평가해서 Ture 또는 False 반환

-표현식 항목의 평가가 True일 경우 다음 표현식 항목이 평가

-표현식 항목의 평가가 False일 경우 다음 검색대상에 대해 첫 번째 표현식부터 재평가

 

 

[검색 대상 방문순서]

-기본으로 디렉터리 우선 방문(pre-order)

-depth옵션이 지정된 경우 디렉터리보다 디렉터리 내부의 항목 우선 방문(post-order)

-depth는 명령 옵션이 아니라 표현식옵션, 항상 true ,경우에 따라 -depth를 지정

 

 

[표현식옵션2]

-maxdepth level, -minddepth level

-탐색최대/최소 싶이 지정

-시작 디렉터리는0 시작디렉터리 내용은1

 

-depth

-디렉터리보다 디렉터리 내용을 먼저 처리

-delete 액션은 자동 –depth

 

-mount, -xdev

-다른 파일시스템을 탐색하지않음

 

-regextype type

-정규표현식 형식을 다른 것으로 변경

[type]

emacs(기본), grep, egrep, awk, sed, gnu-awk, posix-awk, posix-basic, posix-egrep, posix-extended

 

 

 

연산자

-우선 순위는 다음 나열된 순서

괄호 :\( expr \)

not연산자 :\! expr, -not expr

and연산자 :expr1 expr2, expr1 –a expr2, expr1 –and expr2

or연산자 :expr1 –o expr2, expr1 –or expr2

,   :expr1, expr2 -나열의 전체 결과는 expr2의 결과