오늘은 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 댓글 하나 씨게 부탁한다. ^ㅡ^*
댓글