find 명령의 일반적인 형태는 다음과 같다.
find path expressions
각각의 인수들의 의미는 다음과 같다.
- path
- 찾기 시작할 위치를 나타낸다. 예를들어, `.'은 현재 디렉토리를 나타내고, `/'은 루트 디렉토리부터 찾을 겻을 나타낸다.
- expression
- 특정 파일을 찾기 위한 여려가지 조건들을 표현하는 부분으로 option, test, action, operator 등의 구문으로 구성되어진다.
그럼, expression의 각각의 구성 요소에 대하여 알아보자. option은 test와 상관 없이 항상 적용된다. option의 방법에는 다음과 같은 것이 있다.
- -maxdepth n
- 0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, '-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다. -mindepth 옵션은 반대로 동작한다. 즉, 지정한 숫자만큼의 깊이부터 그 하위 디렉토리를 검색한다. (GNU find 버전)
- -follow
- 심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.
- -mount
- 현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.
test에는 다음과 같은 방법들이 있으며, test에 사용하는 인수에는 보다 큰 수를 의미하는 `'나, 보다 작은 수를 의미하는 `'를 함께 사용할 수 있다. 인수에 아무 연산자가 없을 경우에는 정확히 그 인수 값을 의미한다.
- -name
- 파일 이름으로 파일들을 찾을 경우에 사용한다.
- -perm
- 권한 비트를 이용하여 파일들을 찾을 경우에 사용한다.
- -user
- 특정 사용자 소유의 파일들을 찾을 경우에 사용한다.
- -group
- 특정 그룹 소유의 파일들을 찾을 경우에 사용한다.
- -nouser
- 소유자가 없는 파일을 찾을 경우에 사용한다. 즉, /etc/passwd 파일에 없는 소유자의 파일을 찾을 경우에 사용한다.
- -nogroup
- 올바른 그룹의 소유가 아닌 파일을 찾을 경우에 사용한다. 즉, /etc/groups 파일에 없는 그룹의 소유인 파일을 찾을 경우에 사용한다.
- -mtime -n +n
- `-n'은 n 보다 적은 날짜수 이전에 변형된 파일을, `+n'은 n 보다 큰 날짜수 이전에 변형된 파일을 찾을 경우에 사용한다. atime과 ctime이라는 옵션도 있으나 이들 역시 결과적으로는 mtime과 동일하게 동작한다.
- -newer file1 file2
- `file1' 보다는 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.
- -type
- 다음과 같은 특정 형태의 파일을 찾을 경우에 사용한다.
- b - 블럭 파일
- d - 디렉토리 파일
- c - 문자 파일
- p - 파이프 파일
- l - 심볼링 링크 파일
- f - 보통 파일
- -fstype type
- `type'으로 지정한 특정 유형의 파일 시스템이 있는 파일들을 찾을 경우에 사용한다.
- -size n[bckw]
- 크기가 n 유닛(unit)인 파일을 찾을 경우에 사용한다. 유닛은 기본 설정(`b''와 함께 사용한 경우와 동일)인 512 바이트의 블럭, `c'를 사용할 경우에는 1 바이트, `k'를 사용할 경우에는 킬로바이트, `w'를 사용할 경우에는 2 바이트의 워드 크기를 나타낸다.
- -empty
- 비어있는 파일이나 디렉토리를 찾을 경우에 사용한다. (GNU find 버전)
- -regex
- 정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex'는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)
action은 test에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.
- -print
- 찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.
- -fprint file
- 찾은 파일들을 `file'로 출력한다. `file'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어진다. (GNU find 버전)
- -exec
- 파일을 찾았을 경우, 찾은 파일들에 대해 특정 명령을 수행 할 때 사용한다. 일반적으로 `-exec command {} ;'의 형식을 취한다.
- -ok
- `-exec'와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.
- -ls
- `ls -dils' 형식으로 찾은 파일들의 정보를 출력할때 사용한다.
- -fls file
- `ls'와 동일하게 동작하며 결과를 `file'로 출력한다.
operator는 test에서 사용한 옵션들을 조합하여 조건식을 만들고자 할때 사용는 것으로 다음과 같은 방법들이 있다. (설명 순서는 우선순위(precedence)에 따른다.)
- (1)
- ( expression )
표현식의 우선 순위를 높여준다.
- (2)
- !
표현식의 결과를 부정한다. `!'(GNU find 버전)도 동일한 동작을 한다.
- (3)
- expression1 expression2
AND 논리연산을 수행한다. 만약 expression1이 거짓이라면 expression2는 계산되지 않는다. `-a'와 `-and'(GNU find 버전)도 동일한 동작을 한다.
- (4)
- expression1 -o expression2
OR 논리연산을 수행한다. 만약 expression1이 참이면 expression2는 계산되지 않는다. `-or'(GNU find 버전)도 동일한 동작을 한다.
`man find' 명령을 실행해서 find의 메뉴얼을 보면 다른 옵션에 대해서도 알 수 있지만, 이 정도의 옵션만 알아두면 사용하기에 충분할 것이다. 그럼, 이제부터는 예제를 실행해보면서 find를 익혀보자. 각각의 경우에 어떤 옵션을 사용해야할지를 먼저 생각해 본 후에 해답을 보도록 하자.
[예제]
- (1)
- 자신의 홈 디렉토리에서 확장자가 `.txt'인 파일을 찾을 경우
- (2)
- 현재 디렉토리 밑에서 첫글자가 영어 대문자인 모든 파일을 찾을 경우
- (3)
- `/usr/local'에서 첫 두글자는 영어 소문자이고 세번째 한자리는 숫자로 시작하는 이름을 가진 파일을 찾을 경우
- (4)
- (1)번에서의 파일을 찾으면서 현재 디렉토리와 한 단계 밑의 디렉토리에서만 파일을 찾을 경우
- (5)
- 현재 디렉토리 밑에서 `zzang'이라는 이름을 가진 사용자 소유의 파일을 찾을 경우
- (6)
- 시스템에서 소유자나 그룹이 없는 파일을 찾을 경우 (크래커가 만들어 놓은 파일일 경우도 있슴)
- (7)
- 자신의 홈 디렉토리에서 최근 3일 동안 변경된 파일들을 찾을 경우
- (8)
- `/tmp'에서 최근 5일 동안 변경되지 않은 파일들을 찾아서 삭제할 경우 (파일을 삭제할 때마다 삭제할 것인가를 물어보도록)
- (9)
- 현재 디렉토리 밑에 있는 모든 포스트 스크립트 파일(.ps)을 찾아서 gzip으로 압축을 하고 그 목록을 result.txt라는 파일에 저정할 경우
- (10)
- 크랙커의 침입이 의심스러워 자신의 시스템에서 suid와 guid가 설정된 일반 파일들을 찾아서 권한을 확인할 경우
- (11)
- 시스템 관리의 실수로 일반 사용자가 쓰기 권한을 갖도록 설정되어 있는 파일을 찾아서 실행 권한을 없애는 경우 (단, 링크 파일은 제외함)
(해답)
- (1)
- $ find -name ``*.txt'' -print
- (2)
- $ find . -name ``[A-Z]*'' -print
- (3)
- $ find /usr/local -name ``[a-z][a-z][0-9]*'' -print
- (4)
- $ find -maxdepth 2 -name ``*.txt'' -print
- (5)
- $ find . -user zzang -print
- (6)
- $ find / -nouser -o -nogroup -print
- (7)
- $ find . -mtime -3 -print
- (8)
- $ find . -mtime +5 -print -ok rm {} ;
- (9)
- $ find . -name "*.ps" -fprint result.txt -exec gzip {} ;
- (10)
- $ find / -type f -perm +6000 -print -ls
- (11)
- $ find / -perm +2 ! -type l -print -exec chmod o-w {} ;
Dong-Hoon Yoo
2002-03-15