파일 검색(find)

- find 명령: 시스템 내에 있는 파일들 중에서 사용자가 원하는 파일(또는 디렉토리)을 찾음, 찾은 파일에 특정 명령을 실행할 수도 있음

- find는 디렉토리(하위 디렉토리를 포함하여) 트리 내에서 파일을 검색함

- find를 사용할때 지정하는 검색 경로는 절대 경로나 상대 경로를 사용, 결과에 영향(지정하는 경로대로 표현됨)

- find는 테스트, 액션, 옵션을 적용하여 검색할 수 있기 떄문에 특정 조건에 부합하는 파일을 찾아낼 수 있음


1. find 명령어 도움말(자세한 도움말은 man find를 통해 살펴 볼 것)

- path: 파일을 찾을 위치(기본값: 현재 디렉토리) 

- expression: 찾을 파일의 이름이나 찾은 파일에 처리할 기능 지정 (기본값: -print)

- expression의 구성: 연산자(operator), 옵션(option), 테스트(test), 액션(action)


2. 테스트

1) 검색 대상 파일의 종류를 지정(-type c: c 형식의 파일 검색)

 a. find가 지원하는 주요 파일 형식 테스트들

 파일 형식

 설 명

 b

 블록 특수 파일

 c

 문자 특수 파일

 d

 디렉토리

 f

 파일(일반 파일)

 l

 심볼릭 링크 파일

 p

 명명된 파이프

 s

 소켓


b. 예제


2) 검색 파일의 크기 지정(-size n: n 크기의 파일 검색)

- -size +n: 이상, n보다 큰 크기의 파일을 찾음

- -size n: 일치, n과 일치하는 크기의 파일을 찾음

- -size -n: 이하, n보다 작은 파일을 찾음

a. 파일 크기 단위

 기호

 크기 단위

 b

 512바이트 단위의 블록(기본값)

 c

 바이트

 w

 2바이트 크기의 워드

 k

 킬로바이트(1,024바이트)

 M

 메가바이트(1,048,576바이트, 1024킬로바이트)

 G

 기가바이트(1,073,741,824바이트, 1024메가바이트)


b. 예제


3) 검색 대상 파일 또는 디렉토리 지정(-name pattern: 지정된 와일드 카드 패턴과 일치하는 파일과 디렉토리를 검색)

- 예제


4) 검색 대상 파일의 소유주 또는 UID를 지정(-user name: name 사용자에 속한 파일 또는 디렉토리를 검색)

name은 사용자 명이나 UID로 표현

- 예제


5) 검색 대상 파일의 소유 그룹 또는 GID 지정(-group name: name 그룹에 속한 파일 또는 디렉토리 검색)

name은 그룹명이나 GID로 표현

- 예제


6) 주어진 접근권한을 가지는 파일을 검색(-perm mode: 지정된 mode로 퍼미션이 설정된 파일 또는 디렉토리를 검색)

mode는 8진수나 기호로 표현

a. -perm 테스트 도움말

- -perm mode: mode로 명시한 접근 권한과 정확히 일치하는 파일이나 디렉토리를 검색

- -perm -mode: mode로 명시한 접근 권한을 모두 포함하는 파일이나 디렉토리를 검색(and)

- -perm /mode: mode로 명시한 접근 권한을 하나 이상 포함하는 파일이나 디렉토리를 검색(or)

- -perm +mode: -perm /mode와 같음, +대신 /로 변경됨

* 참고: world-writable 취약점을 가진 파일, 디렉토리 확인

공격자가 사용자의 시스템에 사용권을 얻어 시스템 파일이나 world-writable 파일들을 변경할 수 있게 되면 심각한 보안 허점 존재함

1. world-writable 취약점: 모든 사용자가 일고 쓸수 있는 파일 또는 디렉토리를 의미

2. 해결방안: world-writable 취약점을 가진 파일이나 디렉토리를 주기적으로 찾고 확인하여 불필요한 경우 파일이나 디렉토리리릴 삭제하거나 쓰기 권한을 제거해줘야 함

3. world-writable 취약점을 가진 파일 또는 디렉토리 찾기(확인) 명령

find / -perm -2 -ls


b. 예제


7) 파일이 읽힌 최근 시간을 지정하여 검색(-atime n:n*24시간 전에 마지막으로 읽힌 파일 또는 디렉토리를 검색)

8) 파일의 소유주나 권한이 바뀐 최근 시간(-ctime n: n*24시간 전에 마지막으로 내용이나 속성이 변경된 파일 또는 디렉토리를 검색)

9) 파일이 수정된 최근 시간(-mtime n: n*24시간 전에 내용만이 변경된 파일 또는 디렉토리를 검색)


3. 연산자(operator)

- find는 복잡한 논리적 관계를 설정할 수 있도록 논리 연산자를 사용하여 테스트들을 결합하는 방법을 제공

1) find의 논리 연산자

 연산자

 설 명

 -and

 연산자를 기준으로 양쪽 테스트 조건이 모두 참인 경우 검색

 -a로 줄여 쓸 수 있음

 아무런 연산자가 사용되지 않았을 경우 -and가 기본값으로 적용

 -or

 연산자를 기준으로 양쪽 테스트 중 하나라도 참인 경우에 검색

 -o로 줄여 쓸 수 있음

 -not

 연산자 다음에 나오는 테스트가 거짓인 경우에 검색

 -!로 줄여 쓸 수 있음

 ( )

 테스와 연산자를 조합하여 표현한 내용을 하나로 그룹화 할 때 사용
 논리 계산의 우선순위를 정하기 위한 것

 기본적으로 find 명령어는 왼쪽에서 오른쪽으로 계산 수행

 필요한 상황이 아니더라도 명령어의 가독성을 높이기 위해 사용되기도 함

 커맨드 라인에서 사용할 때는 반드시 인용 부호를 사용해야 find의 명령 인자로 인식될 수 있음


2) find의 AND/OR 연산자 로직

- expr1 -operator expr2 : 논리 연산자를 사이에 둔 표현식에서 모든 경우, expr1는 항상 실행 됨, 그러나 expr2에 대해서는 연산자가 그 수행 여부를 결정하게 됨 (검색 성능을 개선하기 위함)

 expr1 수행 결과

 연산자

 expr2 수행 결과

 참

 -and

 실행○

 거짓

 -and

 실행X

 참

 -or

 실행X

 거짓

 -or

 실행


3) 예제

a. 예제 1

- 현재 디렉토리와 하위디렉토리에서 파일의 접근권한이 644로 설정되어 있지 않은지 그리고 디렉토리의 접근권한이 755로설정되어 있지 않은지 확인


b. 예제 2

- 현재 디렉토리와 하위 디렉토리에서 파일크기가 1블럭(512byte)보다 크고 70킬로바이트 보다 작은 일반 파일을 검색


4. 액션

- find는 검색 결과를 토대로 액션을 구현할 수 있음

- 액션은 미리 정의된 액션과 사용자 지정 액션이 있음 (사용자 지정 액션 설명은 생략...)

1) 미리 정의된 find 액션

 액 션

 설 명

 -delete

 현재 검색된 파일을 삭제함

 -ls

 검색된 파일에 대하여 ls -dils와 같은 명령을 실행, 출력은 표준 출력으로 전송

 -print

 검색 결과의 전체 경로명을 표준 출력으로 출력, 

 별도의 액션을 설정하지 않을 경우 이 액션이 기본값

 -quit

 검색 조건에 해당하는 결과가 하나라도 나올 경우 검색 종료


2) 예제

-  현재 디렉토리와 하위 디렉토리에서 .bak 확장자를 가진 파일을 삭제

- 논리 연산자가 액션에 영향을 주기 때문에 어떤 표현을 수행할지 잘 생각해서 순서대로 기입해야 함


5. 옵션

- find의 검색 범위를 설정할 때 사용, 표현식을 만들기 위해 다른 테스트와 액션과 함께 사용될 수 있음

- find 옵션

 옵 션

 설 명

 -depth

 디렉토리 자체 이전에 디렉토리의 파일에 대하여 find를 우선 실행하도록 함

 -delete액션이 지정될 때 자동적으로 적용

 -maxdepth Levels

 테스트와 액션을 실행할 때, find 명령의 대상이 되는 디렉토리 최대 탐색 깊이를 숫자로 지정

 -mindepth Levels

 테스트와 액션을 적용하기 전에, find 명령의 대상이 되는 디렉토리 최소 탐색 깊이를 숫자로 지정

 -mount

 다른 파일시스템에 마운트된 디렉토리의 탐색은 제외시킴

 -noleaf

 유닉스형 파일시스템을 검색한다는 가정하에서 find 최적화를 사용하지 않도록 함

 DOS/윈도우 파일 시스템이나 CD-ROM을 탐색할 때 필요한 옵션