Linux "find" 파일/디렉터리 검색 명령어

Develop/Linux 2020.12.21 댓글 PSJco
728x90
반응형

오늘은 Linux 시스템에서 파일/디렉터리를 검색할 때 사용하는 find 명령어 사용법을 정리해 본다. 

#1. find 란?

find 명령어는 "이름 그대로 리눅스에서 접근할 수 있는 파일 시스템에 파일/디렉터리를 찾는(find) 명령어"이다

어느 OS나 마찬가지지만, 리눅스 파일 시스템은 구조가 아주 복잡하다. 이 중에는, 비슷한 이름의 파일과 동일한 확장자를 가진 파일, 그리고 종류가 다양한 파일들이 존재한다. 복잡한 구조에서 원하는 파일을 가능한 정확히 찾을 수 있도록, find 명령에는 다양한 옵션이 존재한다.

 

자, 그럼 find 명령의 기본적인 사용법을 살펴보고, 다양한 옵션을 통해 우리가 찾는 파일/디렉터리를 신속/정확하게 검색하는 방법에 대해 알아보자.

#2. find 명령어 사용법

사용법 : find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

기본 경로는 현재 디렉토리입니다. 기본 표현식은 -print입니다.
표현식은 연산자, 옵션, 테스트 및 조치로 구성 될 수 있습니다.

연산자 (우선 순위 감소,-다른 항목이 지정되지 않은 경우 암시 적) :
      (EXPR)! EXPR-EXPR EXPR1 아님 -a EXPR2 EXPR1-및 EXPR2
      EXPR1 -o EXPR2 EXPR1-또는 EXPR2 EXPR1, EXPR2

위치 옵션 (항상 참) : -daystart -follow -regextype

일반 옵션 (항상 true, 다른 표현식 앞에 지정됨) :
      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
      --version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race

테스트 (N은 +N, -N, N 일 수 있음) : -amin N -anewer FILE -atime N -cmin N
      -cnewer 파일 -ctime N -empty -false -fstype TYPE -gid N-그룹 이름
      -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex 패턴
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
      -nouser -nogroup -path PATTERN -perm [-/] MODE -regex PATTERN
      -읽기 가능-쓰기 가능-실행 가능
      -wholename PATTERN -size N [bcwkMG] -true -type [bcdpflsD] -uid N
      -used N -user NAME -xtype [bcdpfls]
      -컨텍스트 CONTEXT


작업 : -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
      -fprint0 파일 -fprint 파일 -ls -fls 파일 -prune -quit
      -exec COMMAND; -exec COMMAND {} + -ok COMMAND;
      -execdir COMMAND; -execdir COMMAND {} + -okdir COMMAND;

 

find [옵션] [경로] [표현식]

옵션 :
	-H	심볼릭 링크를 따라가지 않고, Command Line Argument를 처리할때 예외.
	-L	심볼릭 링크에 연결된 파일정보 사용.
	-P	심볼릭 링크를 따라가지 않고, 링크 자체 정보를 사용
	-Olevel	쿼리 최적화를 활성화한다. level : 0-3
	-D [옵션]	디버깅 기능 사용. 
		help	디버깅 옵션을 설명.
		exec	-exec, -execdir, -ok, -okdir 관련 진단 정보를 표시.
		opt	최적화와 관련된 진단 정보 표시.
		rates	각 속성의 성공한 빈도를 나타냅니다.
		tree	표현식 트리를 표시.
		search	디렉토리 트리를 자세히 탐색.
		stat	stat(2), lstat(2)에 대한 추적을 호출한다.
표현식 : 표현식 유형은 Tests | Actions | Global options | Positional Options | Operators 로 나뉜다. 
(여기서는 모두 다루기 어려우므로 자주 사용되는 표현식(옵션,명령) 위주로 설명)
Tests :
	-name		지정된 문자열 패턴에 해당하는 파일 검색.
	-path		지정된 문자열 패턴에 해당하는 경로에서 검색.
	-type		지정된 파일 타입에 해당하는 파일 검색.
	-atime		파일 접근(access) 시간을 기준으로 파일 검색. -atime +1 (접근시간이 24시간 이상인 파일 검색)
	-amin		파일 접근(access) 분을 기준으로 파일 검색. -amin +1 (접근시간이 1분 이상인 파일 검색) 
	-ctime		파일 내용 및 속성 변경(change) 시간을 기준으로 파일 검색. -ctime +1 (변경시간이 24시간 이상인 파일 검색)
	-cmin		파일 내용 및 속성 변경(change) 분을 기준으로 파일 검색. 
	-mtime		파일 데이터 수정(modify) 시간을 기준으로 파일 검색. -mtime +1 (수정시간이 24시간 이상인 파일 검색)
	-mmin		파일 데이터 수정(modify) 분을 기준으로 파일 검색. 
	-user		지정 사용자 소유의 파일을 검색. -user psjco (psjco 소유의 파일 검색)
	-group		지정 그룹에 속한 파일을 검색. 
	-executable	현재 사용자 기준으로 실행가능한 파일 검색.
	-readable	현재 사용자 기준으로 읽을 수 있는 파일 검색.
	-writable		현재 사용자 기준으로 쓸 수 있는 파일 검색.
	-empty		빈 디렉토리 또는 파일 검색.
	-size		파일 크기를 사용하여 파일 검색.
Global options : 
	-mindepth	검색을 시작할 하위 디렉토리 최소 깊이 지정.
	-maxdepth	검색할 하위 디렉토리의 최대 깊이 지정.
Actions : 
	-delete		검색된 파일 또는 디렉토리 삭제.
	-exec		검색된 파일에 대해 지정된 명령 실행.
	-print		검색 결과를 출력. 검색 항목은 newline으로 구분. (기본 값)
	-print0		검색 결과를 출력. 검색 항목은 null로 구분.
	-printf 	검색 결과를 포멧을 지정하여 출력. 
	-quit		첫 검색 결과 출력 후 종료. (더 이상 검색하지 않음) 

표현식 연산자 적용 : 2개 이상 표현식을 조합할 수 있다.
	([EXPR])		연산자 우선순위 설정. "()"
	![EXPR]			NOT 연산자. (-not, !)
	-not [EXPR]
	[EXPR1] -a [EXPR2]	AND 연산자. (-a, and)
	[EXPR1] and [EXPR2] 
	[EXPR1] [EXPR2]		AND 연산자 생략가능!, 2개 이상 표현식에 연산자는 기본 AND
	[EXPR1] -o [EXPR2]	OR 연산자. (-o, or) 
	[EXPR1] or [EXPR2]	
	

#3. 명령어 사용 예제 

기본적인 사용 방법은 다음과 같다. 

$ find [옵션] [경로] [표현식..]

[옵션]의 경우 잘 사용하지 않아서, 존재를 알지 못하는 사용자도 많다. (나 또한 그랬다) 다음 예는 현재 경로에서 "FILE"로 시작하는 파일을 찾는 예입니다. 현재 경로에서의 파일 검색은 파일이 많은 디렉터리가 아닌 이상 사용할 일이 잘 없다. 

$ ll
합계 16
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE3.txt
$ find FILE*
FILE0.txt
FILE1.txt
FILE2.txt
FILE3.txt

그렇다 보니, 다음과 같은 기본 형식으 변형하여 자주 사용한다.

$ find . -name "FILE*"
./FILE0.txt
./FILE1.txt
./FILE2.txt
./FILE3.txt

 

자주 사용되는 find 명령어는 다음과 같다. 

NO. 명령어 설명
1 find 현재 경로에 파일/디렉리 표시
2 find [경로] [경로]에 있는 모든 파일/디렉터리 표시
3 find [NAME] 현재 경로에 [NAME]검색
4 find . -name [NAME] 현재 경로 하위 파일/디렉리에서 [NAME]검색
5 find / -name [NAME] 루트 "/" 디렉리 하위에서 [NAME] 검색
6 find ~ -name [NAME] 사용자의 홈디렉리 하위에서 [NAME] 검색
7 find . -name "*STR*" 현재 경로 하위에서 특정 문자열을 포함하는 파일/디렉리 검색
8 find . -empty 현재 경로 하위에서 빈 디렉리 혹은 크기가 0인 파일 검색
9 find . -name "*.EXT" -delete 현재 경로 하위에서 특정 확장자의 파일 검색 후 삭제처리
10 find . -name [NAME] -print0 현재 경로 하위에서 [NAME]을 검색하여 줄 바꿈 없이 표시
11 find . -name [NAME] -type f,d,l 현재 경로 하위 파일/디렉리/심볼릭링크에서 [NAME]을 검색
12 find . -mtime N 현재 경로 하위에서 수정시간 기준 파일/디렉리 검색
13 find . -size +[SIZE1]c -size -[SIZE2]c 현재 경로 하위에서 파일 사이즈로 검색
14 find . -maxdepth 1 -name [NAME] 현재 경로에서만 [NAME] 검색 (하위 디렉리 미포함)
15 find . -perm 0664 현재 경로에서 특정권한의 파일/디렉리 검색
16 find . -name [NAME] -exec ls -al {} \; 검색된 파일의 상세정보 출력 (ls 명령 실행)
17 find . -name [NAME] -exec grep "STR" {} \; 검색된 파일에서 문자열 검색 (grep 명령 실행)
18 find . -name [NAME] -exec cp {} [경로] \;  검색된 파일을 특정 [경로]로 복사 (cp 명령 실행)
19 find . -name [NAME] -exec tar -xcvf [파일명] {} \;  검색된 파일로 압축파일 생성 (tar 명령 실행)
20 find . -name [NAME] > [FILE_NAME] 검색된 결과를 파일로 저장 (redirection ">" 실행)
21 find . -name [NAME] 2> dev/null 검색결과 오류 메시지 출력 안 함 (redirection ">" 실행)

자, 이제부터 하나씩 간단한 예제와 함께 보충설명 들어간다. 

#3-1. 현재 경로에 파일/디렉토리 표시

find 명령에 옵션, 경로, 표현식을 생략하는 경우 현재 경로 하위에 파일/디렉터리를 찾아 출력한다. 

find : 현재경로 하위에서 파일/디렉터리를 검색해 출력

$ find
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
./FILE0.txt
./FILE1.txt
./FILE2.txt
./FILE3.txt
./DIR0
./DIR0/FILE0.txt
./DIR0/FILE1.txt
./DIR1
./DIR2
./DIR3

#3-2. [경로]에 있는 모든 파일/디렉터리 표시

find 명령에 [경로] 입력을 통해, 해당 경로 하위에 있는 모든 파일/디렉터리를 검색할 수 있다.


find /home : /home 경로 하위에 파일/디렉토리 검색

$ find /home
/home
/home/psjco
/home/psjco/.bash_logout
/home/psjco/.bash_profile
/home/psjco/.bash_history
/home/psjco/FILE0.txt
/home/psjco/FILE1.txt
/home/psjco/FILE2.txt
/home/psjco/FILE3.txt
/home/psjco/DIR0
/home/psjco/DIR0/FILE0.txt
/home/psjco/DIR0/FILE1.txt
/home/psjco/DIR1
/home/psjco/DIR2
/home/psjco/DIR3

#3-3. 현재 경로에 [NAME]검색

find 명령에 문자열 입력을 통해, 현재 경로에 있는 특정 이름을 가진 파일/디렉터리를 검색할 수 있다. (하위 경로 미포함)


find "NAME" : 현재 경로에서 "NAME" 이름의 파일/디렉터리 검색

$ find "FILE0.txt"
FILE0.txt

#3-4. 현재 경로 하위 파일/디렉터리에서 [NAME] 검색

find 명령에 경로를 지정해서, 해당 경로 하위에서 특정 이름을 가진 파일/디렉터리를 검색할 수 있다. 

 

find . -name "NAME" : 현재 경로 하위에서 "NAME"의 파일/디렉터리 검색

$ find . -name "FILE0.txt"
./FILE0.txt
./DIR0/FILE0.txt

#3-5. 루트 "/" 디렉토리 하위에서 [NAME] 검색

find 명령에 경로를 지정해서, 시스템 루트 하위에서 특정 이름을 가진 파일/디렉터리를 검색할 수 있다. (권한이 없을 경우 sudo 명령을 붙여서 실행 필요)

 

find / -name "NAME" : "/" 루트경로 하위에서 "NAME"의 파일/디렉터리 검색

$ sudo find / -name "FILE0.txt"
/home/psjco/FILE0.txt
/home/psjco/DIR0/FILE0.txt

#3-6. 사용자의 홈 디렉터리 하위에서 [NAME] 검색

find 명령에 경로를 지정해서, 사용자 홈디렉터리 하위에서 특정 이름을 가진 파일/디렉터리를 검색할 수 있다. 

 

find ~ -name "NAME" : 사용자 홈 디렉토리 하위에서 "NAME"의 파일/디렉토리 검색

$ find ~ -name "FILE0.txt"
/home/psjco/FILE0.txt
/home/psjco/DIR0/FILE0.txt

#3-7. 현재 경로 하위에서 특정 문자열을 포함하는 파일/디렉토리 검색

find 명령에 문자열 시작/끝에 와일드카드 문자(*)를 포함하여 특정 문자열이 포함된 파일/디렉토리를 검색할 수 있다. 

 

find . -name "*STR*" : 현재 경로 하위에서 "STR" 문자열을 포함하는 파일/디렉터리 검색

$ find . -name "*0*"
./FILE0.txt
./DIR0
./DIR0/FILE0.txt

#3-8. 현재 경로 하위에서 빈 디렉토리 혹은 크기가 0인 파일 검색

-empty 표현식을 사용하면 해당 경로 하위에서 빈 디렉토리 or 크기가 0인 파일을 검색할 수 있다. 

 

find . -empty :현재 경로 하위에서 빈 디렉터리 나 크기가 -0인 파일을 검색

$ find . -empty
./DIR0/FILE1.txt
./DIR1
./DIR2
./DIR3

#3-9. 현재 경로 하위에서 특정 확장자의 파일 검색 후 삭제처리

-delete 표현식을 사용하면 검색된 파일/디렉터리의 삭제처리가 가능하다. -name "*.EXT"로 특정 확장자의 파일을 검색 후 삭제할 수 있다.  

 

find . -name "*.EXT" -delete : ".EXT"확장자를 가진 파일을 찾아 삭제 처리

$ ll
합계 8
-rw-rw-r--. 1 psjco psjco 10 12월 21 13:31 FILE_DEL_TEST.abc
-rw-rw-r--. 1 psjco psjco 10 12월 21 13:32 FILE_DEL_TEST1.abc

$ find . -name "*.abc"
./FILE_DEL_TEST.abc
./FILE_DEL_TEST1.abc

$ find . -name "*.abc" -delete

$ ll
합계 0

#3-10. 현재 경로 하위에서 [NAME]을 검색하여 줄 바꿈 없이 표시

-print0 표현식을 사용하면 출력 결과를 줄 바꿈 없이 표시할 수 있다. -print 표현식의 경우 줄 바꿈을 표시한다. (기본값)

 

find . -name [NAME] -print0 :현재 경로 하위에서 "NAME"의 파일/디렉터리 검색하여 줄 바꿈 없이 표시

$ find . -name "FILE0.txt" -print0
./FILE0.txt./DIR0/FILE0.txt

# -print : 출력 관련 표현식을 생략하면 기본값
$ find . -name "FILE0.txt" -print 
./FILE0.txt
./DIR0/FILE0.txt

#3-11. 현재 경로 하위 파일/디렉터리/심볼릭 링크에서 [NAME]을 검색

-type 표현식을 사용해서 검색 유형을 지정할 수 있다. type"f" 폴더, "d" 디렉터리, "l" 심볼릭링크로 지정할 수 있다.

 

find . -name [NAME] -type f : 현재 경로 하위에서 "NAME"의 파일을 검색하여 표시

$ find . -name "*0*"
./FILE0.txt
./DIR0
./DIR0/FILE0.txt

$ find . -name "*0*" -type f
./FILE0.txt
./DIR0/FILE0.txt

$ find . -name "*0*" -type d
./DIR0

#3-12. 현재 경로 하위에서 수정시간 기준 파일/디렉터리 검색

-mtime 표현식을 통해 수정시간 기준으로 파일을 검색할 수 있다. -atime(액세스 시간), -ctime(변경 시간), -mmin(수정 분), -amin(액세스 분), -cmin(변경 분) 등 표현식도 사용 가능하다. 

 

find . -mtime -N :현재 경로 하위에서 수정시간이 N*24 시간 미만인 파일/디렉터리 검색
+N : 수정시간이 1*24 (24)시간 보다 큰 파일/디렉터리

-N : 수정시간이 1*24 (24)시간 미만인 파일/디렉터리

N : 수정시간이 1*24 (24)시간 정확히 일치하는 파일/디렉터리

$ date
2020. 12. 21. (월) 13:51:22 KST

$ ll -R
.:
합계 16
drwxrwxr-x. 2 psjco psjco 40 12월 21 13:24 DIR0
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR1
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR2
drwxrwxr-x. 2 psjco psjco  6 12월 21 13:32 DIR3
-rwSrw-r--. 1 psjco psjco 14 12월 17 15:32 FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE3.txt

./DIR0:
합계 4
-rw-rw-r--. 1 psjco psjco 15 12월 21 12:54 FILE0.txt
-rw-rw-r--. 1 psjco psjco  0 12월 21 13:24 FILE1.txt

./DIR1:
합계 0

./DIR2:
합계 0

./DIR3:
합계 0

# 수정시간이 24시간 보다 큰 파일/디렉토리 검색
$ find . -mtime +1
./FILE0.txt
./FILE1.txt
./FILE2.txt
./FILE3.txt

# 수정시간이 24시간 미만인 파일/디렉토리 검색
$ find . -mtime -1
.
./DIR0
./DIR0/FILE0.txt
./DIR0/FILE1.txt
./DIR1
./DIR2
./DIR3

# 수정시간이 1000분 미만인 파일/디렉토리 검색
$ find . -mmin -1000
.
./DIR0
./DIR0/FILE0.txt
./DIR0/FILE1.txt
./DIR1
./DIR2
./DIR3

#3-13. 현재 경로 하위에서 파일 사이즈로 검색

-size 표현식을 사용해서 파일/디렉터리 사이즈로 검색도 가능하다. +/- 를 통해 초과/미만으로 검색 가능하며, 크기 값 뒤에 c/k 등의 구분자를 붙여 용량 기준을 설정할 수 있다. 

b : block

c : bytes

w : 2-byte words

k : kibibytes (KiB, unit of 1,024 bytes) 

M : mebibytes (MiB, 1,024*1,024=1,048,576 bytes)

G : gibibytes (GiB, 1,024*1,024*1,024=1,073,741,824 bytes)

 

find . -size +[SIZE1]c -size -[SIZE2]c :현재 경로 하위에서 크기가 SIZE1 bytes 초과 SIZE2 bytes 미만인 파일/디렉터리를 검색한다

$ ll
합계 16
drwxrwxr-x. 2 psjco psjco 40 12월 21 13:24 DIR0
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR1
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR2
drwxrwxr-x. 2 psjco psjco  6 12월 21 13:32 DIR3
-rwSrw-r--. 1 psjco psjco 14 12월 17 15:32 FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE3.txt

# 10bytes 초과하고 40bytes 미만인 파일/디렉토리 검색
$ find . -size +10c -size -40c
./FILE0.txt
./FILE1.txt
./FILE2.txt
./FILE3.txt
./DIR0/FILE0.txt

#3-14. 현재 경로에서만 [NAME] 검색 (하위 디렉토리 미포함)

-maxdepth 표현식을 사용해 검색할 하위 경로의 depth를 한정하여 검색할 수 있다. 

 

find . -maxdepth 1 -name [NAME] :현재 경로에서만 "NAME"의 파일/디렉터리를 검색한다

# 현재 디렉토리에서 이름에 "0"을 포함하는 파일/디렉토리 검색
$ find . -maxdepth 1 -name "*0*"
./FILE0.txt
./DIR0

# 현재 디렉토리 하위 1 depth 에서만 이름에 "0"을 포함하는 파일/디렉토리 검색
$ find . -maxdepth 2 -name "*0*"
./FILE0.txt
./DIR0
./DIR0/FILE0.txt

#3-15. 현재 경로에서 특정 권한의 파일/디렉터리 검색

-perm 표현식을 통해 특정 권한을 가진 파일/디렉터리를 검색할 수 있다. 

 

find . -perm 0664 :현재 경로 하위에서 "0664 -rw-rw-r--" 권한을 가진 파일/디렉터리를 검색한다

$ ll
합계 16
drwxrwxr-x. 2 psjco psjco 40 12월 21 13:24 DIR0
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR1
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR2
drwxrwxr-x. 2 psjco psjco  6 12월 21 13:32 DIR3
-rwSrw-r--. 1 psjco psjco 14 12월 17 15:32 FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE3.txt

#현재 경로하위에서 "0664 -rw-rw-r--" 권한을 가진 파일/디렉토리를 검색한다
$ find . -perm 0664
./FILE1.txt
./FILE2.txt
./FILE3.txt
./DIR0/FILE0.txt
./DIR0/FILE1.txt

#현재 경로하위에서 "4664 -rwSrw-r--" 권한을 가진 파일/디렉토리를 검색한다
$ find . -perm 4664
./FILE0.txt

#3-16. 검색된 파일의 상세정보 출력 (ls 명령 실행)

-exec 표현식과 ls 명령을 사용, 현재 경로 하위에서 "NAME"을 포함하는 파일/디렉토리를 검색 후 -exec ls -al을 통해 상세정보를 출력한다. 

 

find . -name [NAME] -exec ls -al {} \; : 현재 경로 하위에서 "NAME"의 파일/디렉터리를 검색 후 상세 정보를 출력

$ find . -name "FILE*" -exec ls -al {} \;
-rwSrw-r--. 1 psjco psjco 14 12월 17 15:32 ./FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 ./FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 ./FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 ./FILE3.txt
-rw-rw-r--. 1 psjco psjco 15 12월 21 12:54 ./DIR0/FILE0.txt
-rw-rw-r--. 1 psjco psjco 0 12월 21 13:24 ./DIR0/FILE1.txt

#3-17. 검색된 파일에서 문자열 검색 (grep 명령 실행)

-exec 표현식과 grep 명령을 사용, 현재 경로 하위에서 "NAME"을 포함하는 파일/디렉토리를 검색 후 -exec grep "STR"을 통해 검색된 파일에서 "STR" 문자열을 포함한 라인을 출력할 수 있다. 

 

find . -name [NAME] -exec grep "STR" {} \; : 현재 경로 하위에서 "NAME"의 파일을 검색 후 "STR"문자를 포함하는 라인을 출력

# 현재경로 하위에 "FILE"로 시작하는 파일/디렉토리를 검색 후 
# 해당 파일의 내용중에 "test" 문자열을 포함하는 라인을 출력
$ find . -name "FILE*" -exec grep -i "test" {} \;
test test test test
test1 test1 test1
test2 test2
test3
test0 file

# 현재경로 하위에 "FILE"로 시작하는 파일/디렉토리를 검색 후 
# 해당 파일의 내용중에 "test" 문자열을 포함하는 라인을 파일명/라인번호를 포함해 출력
$ find . -name "FILE*" -exec grep -Hn "test" {} \;
./FILE0.txt:4:test test test test
./FILE0.txt:5:test1 test1 test1
./FILE0.txt:6:test2 test2
./FILE0.txt:7:test3
./DIR0/FILE0.txt:1:test0 file

#3-18. 검색된 파일을 특정 [경로]로 복사 (cp 명령 실행)

-exec 표현식과 cp 명령을 사용해서 검색된 파일을 특정 경로로 복사할 수 있다. 

 

find . -name [NAME] -exec cp {} [경로] \; : 현재 경로 하위에서 "NAME"의 파일/디렉터리를 검색 후 "경로"로 복사

# 현재경로에서(하위경로 미포함) "FILE0.txt" 파일을 "DIR3/" 으로 복사
$ find . -maxdepth 1 -name "FILE0.txt" -exec cp {} DIR3/ \;

$ find . -name "FILE0.txt"
./FILE0.txt
./DIR0/FILE0.txt
./DIR3/FILE0.txt

#3-19. 검색된 파일로 압축파일 생성 (tar 명령 실행)

-exec 표현식과 tar 명령을 사용해서 검색된 파일을 압축파일로 생성할 수 있다. 

 

find . -name [NAME] -exec tar -xcvf [파일명.tar.gz] {} \; : 현재 경로 하위에서 "NAME"의 파일/디렉터리를 검색 후 "파일명.tar.gz" 압축파일 생성

$ find . -name "FILE1.txt" -exec tar -zcvf FILES.tar.gz {} \;
./DIR0/FILE1.txt
./FILE1.txt

$ ll
합계 24
drwxrwxr-x. 2 psjco psjco  40 12월 21 15:21 DIR0
drwxrwxr-x. 2 psjco psjco   6 12월 21 12:38 DIR1
drwxrwxr-x. 2 psjco psjco   6 12월 21 12:38 DIR2
drwxrwxr-x. 2 psjco psjco  23 12월 21 15:59 DIR3
-rwSrw-r--. 1 psjco psjco  69 12월 21 15:21 FILE0.txt
-rw-rw-r--. 1 psjco psjco  14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco  14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco  14 12월 17 15:32 FILE3.txt
-rw-rw-r--. 1 psjco psjco 140 12월 21 16:05 FILES.tar.gz
-rw-rw-r--. 1 psjco psjco  36 12월 21 15:30 FILE_LIST.txt

#3-20. 검색된 결과를 파일로 저장 (redirection ">" 실행)

">" redirection 표현식을 사용해서 -print 표준 출력이 아닌 결과를 파일로 저장할 수 있다. 

 

find . -name [NAME] > [FILE_NAME] : 현재 경로 하위에서 "NAME"의 파일/디렉터리를 검색 후 "FILE_NAME" 파일에 결과를 출력

$ find . -name "*0*" > FILE_LIST.txt

$ ll
합계 20
drwxrwxr-x. 2 psjco psjco 40 12월 21 15:21 DIR0
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR1
drwxrwxr-x. 2 psjco psjco  6 12월 21 12:38 DIR2
drwxrwxr-x. 2 psjco psjco  6 12월 21 13:32 DIR3
-rwSrw-r--. 1 psjco psjco 69 12월 21 15:21 FILE0.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE1.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE2.txt
-rw-rw-r--. 1 psjco psjco 14 12월 17 15:32 FILE3.txt
-rw-rw-r--. 1 psjco psjco 36 12월 21 15:30 FILE_LIST.txt

$ cat FILE_LIST.txt
./FILE0.txt
./DIR0
./DIR0/FILE0.txt

#3-21.검색 결과 오류 메시지 출력 안 함 (redirection ">" 실행)

">" redirection 표현식을 사용하면, find 명령 실행 시 빈번하게 발생하는 permission 관련 오류 메시지를 표시하지 않도록 하여 결과 확인을 원활하게 할 수 있다. 

 

find / -name [NAME] 2> dev/null : 시스템 루트 하위에서 "NAME"의 파일/디렉터리를 검색, 오류 메시지 출력 안 함

표준 에러(2)를 "/dev/null"로 Redirection 처리

# 오류메시지 출력
$ find / -name "FILE0*"
find: ‘/boot/efi/EFI/centos’: 허가 거부
find: ‘/boot/grub2’: 허가 거부
/home/psjco/FILE0.txt
/home/psjco/DIR0/FILE0.txt
find: ‘/proc/tty/driver’: 허가 거부
...
...

# 오류메시지 출력 안함.
$ find / -name "FILE0*" 2> /dev/null
/home/psjco/FILE0.txt
/home/psjco/DIR0/FILE0.txt

 

이상 리눅스 "find" 명령어에 대해 정리해 봤다.

실무에서 자주 사용하게되는 추가 명령어나, 표현식이 생기면 업데이트하겠다. 

 

도움이 되셨다면, 공감 or 댓글 하나 씨게 부탁한다. ^ㅡ^*

728x90
반응형

댓글