[Linux] 파일 검색 명령어 (find, locate)

반응형

1. find : 디렉토리 트리에서 파일 검색

◼︎ 파일 검색

find <검색할디렉토리> <검색조건> <액션>

<검색할디렉토리> 를 기점으로 <검색조건>을 만족하는 파일들을 찾아 <액션>을 실행한다. <검색조건>에 아무런 조건도 지정하지 않으면 지정한 디렉토리 안의 모든 파일과 디렉토리를 대상으로 <액션>이 실행된다.

 

(예제) 현재 디렉토리 (.) 를 기점으로 file-A.txt 라는 파일을 찾아 경로를 출력하는 예이다.

-name file-A.txt 가 검색조건에 해당하며, -print 는 액션을 의미한다. 참고로 액션부분을 생략하면 -print가 기본적으로 사용된다.

$ find . -name file-A.txt -print

 

다음과 같이 테스트용 파일을 생성한 후 find 명령어로 file-A.txt 파일만 찾아 경로를 출력해보았다.

즉, find 명령어는 지정한 디렉토리 트리를 기점부터 내려가면서 검색 조건에 일치하는 파일을 검색한다. 따라서 중첩 디렉토리 안의 파일도 쉽게 찾을 수 있다. 

 

 

(1) ❮검색조건❯ -name , -iname : 이름으로 검색

검색조건 사용
-name 대소문자 구분하여 파일이름 검색
-iname 대소문자 무관하게 파일이름 검색

와일드카드도 사용 가능하다.

와일드카드 내용
* 임의의 문자열
? 임의의 한 문자

중요한 것은 -name 검색조건으로 이름을 지정할때 와일드카드(* 또는 ?)를 사용한다면 반드시 따옴표 ' 로 감싸줘야 한다. 감싸주지 않으면 다음과같이 *.txt에 해당하는 파일이 2개 존재할때, 셸에 의하여 -name 인자로 파일이 2개 지정한 것으로 되므로 쿼테이션(따옴표)이 필요하다는 에러메시지가 출력된다. ' 또는 " 의 따옴표로 감싸주면 셸이 확장하지 않으므로 따옴표 안의 *.txt 를 그대로 find 명령어로 전달하여 실행시키게 된다. find 뿐만 아니라 모든 명령어를 실행할때 * 와같이 셸이 변환할 수 있는 문자를 인자로 지정할때 주의해야 한다.

 

find: paths must precede expression: '파일명'

find: possible unquoted pattern after predicate '-name'?

와일드카드를 따옴표로 감싸지 않았을때 발생하는 에러

구체적으로, 다음과 같이 실행된다.

  • 내가 실행한 명령어

$ find -name *.txt -print

  • 셸에 의해 확장되어 실행된 명령어

$ find . -name file-A.txt file-B.txt -print

셸에 의해 확장되어 인수가 2개 (file-A.txt, file-B.txt) 로 되어 에러가 발생한다.

 

 

다음과 같이 사용하면 된다. 쿼테이션으로 묶어 텍스트파일(.txt)을 모두 출력해보았다.

$ find . -name '*.txt' -print

 

 

(2) ❮검색조건❯ -type : 파일형식으로 검색

다음과 같이 -type 뒤에 <파일형식>을 지정하여 해당 파일형식으로 검색한다.

$ find . -type <파일형식> -print

대표적으로 다음 세가지가 존재한다.

파일형식 내용
-type f 일반적인 파일
-type d 디렉토리
-type l 심볼릭링크

 

디렉토리를 검색하여 출력하는 예

 

 

(3) ❮검색조건❯ -a : 검색조건 여러 개

-a (and) 를 사용하여 복수의 검색조건을 지정하여 검색할 수 있다.

 

파일이름에 대시(-)가 들어가는 텍스트 파일만 검색하고 싶을 때 다음과 같이 사용할 수 있다.

$ find . -type f -a -name '*-*.txt' -print

결과를 보면 파일이름에 대시(-)가 들어가지 않는 텍스트파일 (testfile.txt) 은 출력되지 않았다.

또한 다음과 같이 -a 를 생략하고 검색조건만 나열해도 and 조건으로 검색된다.

 

 

2. locate : 데이터베이스에서 파일 검색

◼︎ 파일 검색

locate [옵션] <검색패턴>

 

경로의 일부를 지정하여 파일을 검색할 때 사용하는 명령어 이다. 전용 데이터베이스에서 검색하므로 디스크를 스캔해서 파일을 찾는 명령어 find 보다 빠르다.

 

(1) 설치하기

locate는 별도 설치가 필요할 수 있으므로 먼저 설치가 필요하다. 먼저 설치가 되어 있는지 다음의 명령어로 확인해보자.

locate --version

설치가 되어 있지 않다면 다음과같은 메시지가 출력된다. 'locate' 라는 명령어(커맨드)를 찾을수 없다. 다음의 sudo 명령어로 설치할 수 있다고 출력되므로 설치 명령어를 실행하면 된다. (우분투 22.04를 이용중이다. mlocate 보다 plocate가 빠르다.)

Command 'locate' not found, but can be installed with: sudo apt install plocate

아래 어느 명령어든 무방하다. 둘다 설치하는 명령어이다. apt 명령은 apt-get보다 사용자 친화적인 대안으로 설계된 것으로, 사용자 편의를 위해 여러 패키지 관리 도구의 기능을 결합한 것입니다.

sudo apt install plocate
sudo apt-get install plocate

참고로 데비안(Debian) 계열의 우분투에서는 apt 를 이용하지만, CentOS 에서는 yum 명령어를 이용한다.

 

설치 후 다시 버전확인 명령어로 설치여부를 확인했다. 설치된 plocate 1.1.15 버전이 출력되었다.

locate 명령어를 설치했으면 가장 먼저 파일 경로 목록을 데이터베이스에 등록해야 한다. 다음과 같이 슈퍼 사용자 원한으로 updatedb 명령어를 실행하면 데이터베이스가 만들어진다.

$ sudo updatedb

 

(2) 파일 검색

다음과같이 bash 라는 문자열이 포함된 파일을 검색하도록 실행하면 find 보다 매우 빠르게 검색되는 것을 확인할 수 있다.

$ locate bash

 

file-A만 검색해보면 다음과같이 출력된다.

 

find는 명령어를 실행할 때마다 디렉토리 트리를 스캔하며, locate 는 사전에 데이터베이스를 만들어 놓고 활용하기 때문에 검색속도가 매우 빠르다. locate 명령어는 기본적으로 데이터베이스를 하루에 한 번 만들도록 설정된다. 따라서 다음과같은 문제가 발생할 수 있다.

  • locate 로 검색된 파일이 실제로는 디스크에 존재하지 않을 수 있다.
  • locate 로 검색되지 않는 파일이 실제로는 디스크에 존재할 수 있다.

 

(3) -i , --ignore-case : 대소문자 구분하지 않고 검색

-i 또는 --ignore-case 를 붙이면 대소문자를 구분하지않고 검색한다. 다음과 같이 -i 를 붙여 file-A 를 검색하면 file-A.txt 뿐만 아니라 FILE-A.txt 도 출력된다.

 

(4) -b, --basename : 파일이름만으로 검색

디렉토리가 아닌 파일이름만 검색할 경우에는 -b 또는 --basename 을 지정해줘야한다.

 

만약 -b 를 지정하지 않으면 디렉토리도 검색대상이므로 경로에 해당하는 문자열이 존재하면 모두 출력된다.

예를들어 다음과같이 locate dirA 로 검색하면 파일이름에 dirA가 없더라도 경로에 dirA가 있으면 출력된다.

 

 

 

 

 

 

반응형