메뉴 건너뛰기

Korea Oracle User Group

OS

Unix(HP-UX / IBM / SUN) find 사용하기

명품관 2016.03.04 16:39 조회 수 : 728

find 사용하기

 

find 명령어 자체는 매우 간단한 문법을 지니고 있습니다.

 

find where_to_search expressions

 

expression 부분은 유닉스마다 조금씩 다른 문법을 가지고 있어

사용시 find의 man page를 확인해 보는 것이 좋습니다.

 

FreeBSD에서 많이 사용되는 expression은 다음과 같습니다.

-name

와일드카드와 함께 사용될 때에는 반드시 따옴표로 묶어야 함

-type

예를 들면 f=file d=directory l=link

-user

이름이나 UID

-group

이름이나 GID

-perm

권한을 지정

-size

다음 512바이트 블럭까지 찾음. byte로 지정하기 위해서는 c를 사용

-atime

파일이 읽힌 가장 최근 시간

-ctime

파일의 소유자나 권한이 바뀐 가장 최근 시간

-mtime

파일이 수정된 가장 최근 시간

-newer

주어진 파일보다 나중에 만들어진 파일을 찾음

-delete

찾은 파일을 삭제

-ls

ls -dgils 와 같은 결과를 출력

-print

find 명령의 실행 결과를 출력

-exec command {} \;

command를 실행. 문법에 주의

-ok

명령어가 실행되기 전 exec대신 사용

-depth

주어진 디렉토리의 루트 디렉토리가 아닌 그 디렉토리의 가장 낮은 레벨에서부터 시작

-prune

어떤 서브 디렉토리를 제외하고자 할 때 사용

 

find의 사용 목적을 확인해 보기 위해 whatis 명령어를 사용해 확인하면

 

whatis find
find(1)          - walk a file hierarchy

 

find는 요청한 표현식에 맞는 파일들을 찾기 위해 디렉토리를 재귀적으로 검색하는 것을 의미합니다.

이런 기능을 활용하여 다른 여러 일도 할 수 있습니다.

예제를 살펴보도록 하겠습니다.

가장 간단한 find 사용법은 다음처럼 간단합니다.

 

find . -print

 

"."는 현재 디렉토리를 의미하며 실행되고 있는 디렉토리와 그 모든 서브 디렉토리에 있는 파일을 찾아서 화면에 출력합니다.

find 명령어는 매우 강력한 작업을 할 수 있기 때문에, find 명령을 실행시킬 디렉토리로 우선 이동한 후 작업을 시작하는 것이 좋은 습관입니다.

 

일반적으로 find 명령어는 여러 옵션을 같이 사용하여 사용하게 됩니다.

 

find . -name file1 -print            
./file1

 

find 명령을 내릴때 현재 디렉토리(".")에서부터 찾으며 파일이름(-name)이 file1인 것을 찾고 그결과를 화면에 출력하라는 옵션을 사용했습니다.

위의 결과에서 file1이 하나 출력되었기 때문에 현재 디렉토리와 그 하위 디렉토리에 파일이름이 file1인 것은 단 하나 존재합니다.

특정한 확장자를 갖는 모든 파일을 찾는 경우 아래와 같이 명령어를 사용하면 됩니다.

 

find . -name "*.pdf" -print
./download/1.pdf
./download/2.pdf
./download/3.pdf
./4.pdf

 

주목할 점은 위의 명령어를 사용할때 *.pdf를 항상 인용부호로 감싸야 한다는 것입니다.

즉 *.pdf 대신 "*.pdf"를 사용해야 합니다.

인용부호로 감싸는 방법이 두가지 더 있습니다. 다음의 두 명령어는 똑같은 결과를 출력합니다.

 

find . -name \*.pdf -print
find . -name '*.pdf' -print

 

만약 download 디렉토리 내에 있지 않은 pdf 파일만을 찾고자 한다면

위의 명령어의 결과를 pipe를 통해 grep에게 전달하면 됩니다.

 

find . -name "*.pdf" -print | grep -v "^\./download/"
./4.pdf

 

grep에서 -v는 역필터를 설정하는 옵션입니다. grep -v 다음에 나오는 것과 반대되는 것을 보여주는 것입니다.

문자 ^\ 를 볼 수 있습니다. ^는 grep에게 표현식이 각 라인의 1열에서부터 일치한 것만을 찾으라고 말하는 것입니다.

\는 .를 특수문자로 해석하지 못하게 하기 위해 쓰인 추가적인 인용부호입니다.

표현식 전체는 grep에게 ./download/ 디렉토리에 있지 않는 파일들을 listup 하라는 의미입니다.

find는 파일을 찾는 작업뿐만이 아니라 파일을 다른 디렉토리로 옮기는 작업도 할 수 있습니다.

다음의 예제를 살펴보도록 하겠습니다.

 

find . -name "*.pdf" -print | grep -v "^\./download/" | xargs -J X mv X ./book/

 

일단 grep은 find 의 결과를 필터링합니다. grep의 결과값이 pipe를 통해 xargs 명령어로 전달이 되고 xarg의 J 스위치는 xargs 명령어에게 stdin으로 들어오는 모든 파일을 소스로, 명령어 다음에 나오는 파일을 목적지로 가정하게 합니다.

찾은 파일이 몇개인지 상관없이 xargs가 해당 파일 모두를 book 디렉토리로 옮기게 합니다. 

또 J 스위치가 올바르게 작동하기 위해서 X라는 문자열을 정의하였고 mv 다음에 삽입하였습니다.

읽은지 30일 이상이 지난 파일들을 찾고자 한다면 다음과 같이 하면 됩니다.

 

find . -atime +30 -print

 

수정하지 않은 파일을 찾고자 한다면 -mtime, 소유권을 변경하지 않은 파일을 찾고자 한다면 -ctime을 사용합니다.

+ 다음의 숫자는 날짜를 의미합니다.

오늘 변경된 파일을 찾고자 한다면 다음과 같이 하면 됩니다.

 

find . -mtime -1 -print

 

이는 24시간내에 수정된 파일을 찾아서 보여줍니다.

하루 이전의 파일에 관심이 있기 때문에 - 옵션을 사용했습니다.

시간에 관한 또다른 스위치는 -newer 입니다.

위에서 알아본 3가지 시간에 관한 스위치는 모두 24시간 단위로만 사용이 가능합니다.

좀 더 작은 시간 단위에서 작업을 하고자 한다면 - newer 스위치를 이용할 수 있습니다.

이를 이용해 1분 단위로 파일의 접근이나 수정, 변경을 비교할 수 있습니다.

예를 들면 여러분이 .cshrc 파일을 수정한 이후에 수정된 .으로 시작하는 파일을 찾고자 한다면, 다음과 같이 하면 됩니다.

 

find . -type f -name ".*" -newer .cshrc -print

 

 

-type이란 스위치는 파일의 타입을 지정하는 스위치입니다.

디렉토리가 아닌 파일만을 찾기 위해 -type f를 추가했습니다.

그리고 -name 스위치를 통해 이름이 .으로 시작하는 파일을 찾아 -newer 스위치를 이용해 .cshrc 파일을 수정한 이후에 수정된 파일들을 찾도록 하였습니다.

여러 스위치를 결합해서 사용할때 -o 나 논리 or를 사용하지 않는다면 모든 결과는 논리적인 and 의 결과입니다. 위에서도 모든 스위치가 논리적 and로 결합되어 있기 때문에 find는 이러한 조건(타입이 파일이고 어떤 특정한 이름을 가지고 있고 .cshrc파일보다 이후에 수정된)을 모두 만족하는 것을 찾아줄 것입니다.

논리적 and 와 논리적 or의 차이를 알아보도록 하겠습니다.

만약 디렉토리에 있는 7일이상 접근하지 않고 크기가 10MB이상인 파일을 찾고자 한다면 다음과 같이 하면 됩니다.

 

find . -atime +7 -size +20480 -print

 

하지만 만약 7일 이상 접근하지 않은 파일 이거나 크기가 10MB이상인 파일을 찾고자 한다면 다음처럼 해야 합니다.

 

find . -atime +7 -o -size +20480 -print

 

여기서 -size 스위치를 사용하기 위해서 약간의 계산이 필요하다.

이는 -size가 크기를 512바이트 단위로 인식하기 때문입니다.

하지만 다음과 같이 한다면 계산은 필요없습니다.

 

find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print

 

위의 예제에서 backquotes(`) 사이에서 필요로하는 계산을 한다. (`는 키보드의 가장 왼쪽 상단에 있습니다.)

10MB 이상의 파일을 찾길 원하기 때문에 backquotes 앞에 +가 여전히 존재합니다.

find 명령어 앞에 echo를 더해서 그 결과가 무엇인지 미리 알아볼 수 있습니다.

 

echo find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print
find . -atime +7 -size +20480 -print

 

위와 같이 복잡한 명령어를 실행할 때에는, backquote를 한 것이 올바른 결과를 출력하는지 등을 미리 검사해 보는 것이 좋은 습관이 될 수 있다.

위로