find

2021년 8월 3일 수정

find

find 는 특정 디렉터리에서 파일이나 디렉터리를 검색하기 위한 CLI 도구다.

기본 사용법

현재 디렉터리에서 특정 파일 검색하기

find . -name "somename.ext"

위 명령은 현재 디렉터리에서 somename.ext 라는 파일이 어디에 있는지 검색한다. 현재 디렉터리 뿐만 아니라 현재 디렉터리 아래의 모든 디렉터리를 재귀(recursive)적으로 검색한다.

특정 디렉터리에서 특정 파일 검색하기

find /foo/bar "somename.ext"

위 명령은 /foo/bar 디렉터리 아래에서 somename.ext 파일을 검색한다.

검색 패턴

찾을 패턴으로 와일드카드를 사용할 수도 있다.

find . -name "*.py"

위 명령은 현재 디렉터리 아래의 모든 확장자가 .py 인 파일들을 검색합니다.

대소문자 무시하기

기본적으로 이 도구는 대소문자를 가린다. 만약 대소문자를 가리지 않으려면 iname 옵션을 사용할 수 있다.

find . -iname "readme"

검색 종류 지정하기

만약 특정한 종류만 검색하고 싶다면 type 옵션을 사용할 수 있다.

find . -name "lib" -type d

type 으로 d 옵션을 주면 디렉터리 만을 검색한다. 반대로 f 로 대체하면 파일 만을 검색한다.

이 외에도 파일의 시간 정보, 퍼미션, 사이즈 등등 다양한 옵션으로 검색이 가능하다.

검색 내용으로 특정 처리하기(exec)

-exec 옵션은 검색된 내용을 이용해 외부 도구를 실행시킬 수 있게 할 수 있다.

예를 들어 확장자가 .tmp 라는 파일을 검색해서 모두 삭제하고 싶다면 아래처럼 할 수 있다.

find . -name "*.tmp" -exec rm {} \;

-exec 옵션 다음에는 실행시킬 커맨드가 나온다. 여기서 {} 는 실제로 검색된 각 파일의 경로가 치환되는 부분이다.

-exec 커맨드는 세미콜론 ; 을 명시한 부분까지 인식한다. 그런데 위 커맨드는 \; 로 세미콜론 앞에 백슬래시를 표시하고 있다. 이는 이 세미콜론을 명령어를 끊는 특수한 용도로 사용하기 때문에 세미콜론을 raw text 로 넘겨주기 위해 이스케이프(escape)한 것이다. 잘 이해가 안 된다면 그냥 -exec 옵션의 끝 부분에는 반드시 \; 가 들어가야 한다고 생각하자.

특정 크기 이상의 파일 검색하기

아래 커맨드는 파일 사이즈가 1기가 이상인 파일을 검색한다.

find . -type f -size +1G

-type f 를 이용해 파일만 필터하는 이유는 당연하게도 디렉터리는 크기를 가지지 않기 때문이기도 하다.

사이즈는 +1G 혹은 +1M 등 다양한 단위가 존재한다.