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 와 같은 결과를 출력 |
|
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를 한 것이 올바른 결과를 출력하는지 등을 미리 검사해 보는 것이 좋은 습관이 될 수 있다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
5 | 세마포어(semaphore) | 명품관 | 2021.12.21 | 687 |
4 | 절대 경로가 포함된 스크립트 생성 하기 [1] | Talros | 2016.10.10 | 603 |
3 | HP-UX Glance adviser를 활용하여 모니터링 데이터 수집 | 명품관 | 2016.04.08 | 9699 |
» | find 사용하기 | 명품관 | 2016.03.04 | 832 |
1 | vi 에디터 환경 설정 | 명품관 | 2016.02.02 | 761 |