File Search Find Option using CLI on Linux
1. Find는 파일 및 디렉토리를 검색할 때 사용 <Unix/Linux>
2. Find 옵션.
find [OPTION…] [PATH] [EXPRESSION…]
OPTION
-P : 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체 정보 사용.
-L : 심볼릭 링크에 연결된 파일 정보 사용.
-H : 심볼릭 링크를 따라가지 않으나, Command Line Argument를 처리할 땐 예외.
-D : 디버그 메시지 출력.
EXPRESSION
-name : 지정된 문자열 패턴에 해당하는 파일 검색.
-empty : 빈 디렉토리 또는 크기가 0인 파일 검색.
-delete : 검색된 파일 또는 디렉토리 삭제.
-exec : 검색된 파일에 대해 지정된 명령 실행.
-path : 지정된 문자열 패턴에 해당하는 경로에서 검색.
-print : 검색 결과를 출력. 검색 항목은 newline으로 구분. (기본 값)
-print0 : 검색 결과를 출력. 검색 항목은 null로 구분.
-size : 파일 크기를 사용하여 파일 검색.
-type : 지정된 파일 타입에 해당하는 파일 검색.
-mindepth : 검색을 시작할 하위 디렉토리 최소 깊이 지정.
-maxdepth : 검색할 하위 디렉토리의 최대 깊이 지정.
-atime : 파일 접근(access) 시각을 기준으로 파일 검색.
-ctime : 파일 내용 및 속성 변경(change) 시각을 기준으로 파일 검색.
-mtime : 파일의 데이터 수정(modify) 시각을 기준으로 파일 검색.
연산자(Operator)를 통한 “두 개 이상의 표현식” 조합
표현식 설명
(expression) expression 우선순위 지정.
!expression
-not expression expression 결과에 NOT 연산.
expression -a expression
expression -and expression
expression expression expression 간 AND 연산.
expression -o expression
expression -or expression expression 간 OR 연산.
두 개 이상의 표현식을 사용 시 연산자를 미지정 하면, 기본적으로 -a (AND) 적용 (“-empty -print” = “-empty -a -print”)
3. find 명령 사용 예제.
현 디렉토리 내 지정된 이름 탐색 간단. find 명령 뒤에 파일이름 지정
$ ls
FILE_1 FILE_2 FILE_3
$ find FILE_1
FILE_1
$ find . -name “FILE”
find 사용 예 명령어 옵션
현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시 find
대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시 find [PATH]
현재 디렉토리 아래 모든 파일 및 하위 디렉토리에서 파일 검색 find . -name [FILE]
전체 시스템(루트 디렉토리)에서 파일 검색 find / -name [FILE]
파일 이름이 특정 문자열로 시작하는 파일 검색 find . -name “STR*”
파일 이름에 특정 문자열이 포함된 파일 검색 find . -name “*STR*”
파일 이름이 특정 문자열로 끝나는 파일 검색 find . -name “*STR”
빈 디렉토리 또는 크기가 0인 파일 검색 find . -empty
특정 확장자를 가진 모든 파일 검색 후 삭제 find . -name “*.EXT” -delete
검색된 파일 리스트를 줄 바꿈 없이 이어서 출력하기 find . -name [FILE] -print0
파일 또는 디렉토리만 검색하기 find . -name [FILE] -type f
파일 크기를 사용하여 파일 검색 find . -size +[N]c -and -size -[M]c
검색된 파일에 대한 상세 정보 출력. (find + ls) find . -name [FILE] -exec ls -l {}
검색된 파일의 라인 수 출력. (find + wc) find . -name [FILE] -exec wc-l {} \;
검색된 파일에서 문자열 찾기. (find + grep) find . -name [FILE] -exec grep “STR” {}
검색 결과를 파일로 저장. (find, redirection) find . -name [FILE] > [SAVE_FILE]
검색 중 에러 메시지 출력하지 않기 (find, redirection) find . -name [FILE] 2> /dev/null
하위 디렉토리 검색하지 않기 find . -maxdepth 1 -name [FILE]
검색된 파일 복사. (find + cp) find . -name [FILE] -exec cp {} [PATH]
3.1 현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시.
디렉토리 파일 리스트를 다른 명령으로 전달하여 처리하고자 할 때 사용
$ find # 현재 디렉토리의 파일 및 디렉토리 출력
$ find -print0 # 현재 디렉토리의 모든 내용을 줄 바꿈 없이 출력.
3.2 대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시.
find 명령 다음에 디렉토리를 지정하여, 대상 디렉토리에 있는 파일 및 디렉토리 리스트를 표시합니다.
$ find [PATH] # PATH에 있는 파일 및 디렉토리 리스트 표시.
$ find DIR_1
DIR_1
DIR_1/FILE_1
DIR_1/FILE_2
DIR_1/FILE_3
3.3 현재 디렉토리 아래 모든 파일 및 하위 디렉토리에서 파일 검색
현재 디렉토리에 포함된 모든 하위 디렉토리 및 파일에서 지정된 파일을 검색하려면 아래 명령을 수행하면 됩니다.
$ find . -name [NAME] # 현재 디렉토리 아래 모든 파일 및 디렉토리 검색.
$ find . -name “FILE_1”
./FILE_1
./DIR_1/FILE_1
3.4 전체 시스템(루트 디렉토리)에서 파일 검색
디렉토리 경로를 루트(/)로 지정하여 전체 시스템 중 특정 파일을 검색할 수 있습니다.
$ find / -name [NAME] # 루트 디렉토리에서 파일 이름으로 검색.
$ find / -name “FILE_1”
/home/ppotta/FILE_1
/home/ppotta/DIR_1/FILE_1
3.5 파일 이름이 특정 문자열로 시작하는 파일 검색
찾을 파일 이름에 와일드 카드(*) 문자를 포함하여 특정 문자열로 시작하는 파일을 검색할 수 있습니다.
$ find . -name “STR*” # 지정된 문자열로 시작하는 파일 검색.
$ ls
A_FILE B_FILE C_FILE
$ find . -name “B*”
./B_FILE
3.6 파일 이름에 특정 문자열이 포함된 파일 검색
찾을 파일 이름 시작과 끝에 와일드 카드(*) 문자를 포함하여 특정 문자열이 포함된 파일을 검색할 수 있습니다.
$ find . -name “*STR*” # 지정된 문자열이 포함된 파일 검색.
$ ls
A_FILE B_FILE C_FILE
$ find . -name “*IL*”
./B_FILE
./C_FILE
./A_FILE
3.7 파일 이름이 특정 문자열로 끝나는 파일 검색 (파일 확장자로 검색)
찾을 파일 이름 끝에 와일드 카드(*) 문자를 사용하여 특정 문자열로 끝나는 파일을 검색할 수 있습니다. 확장자가 일치하는 파일을 검색할 때 유용합니다.
$ find . -name “*STR” # 지정된 문자열로 끝나는 파일 검색.
$ ls
A.c A.h B.c B.h
$ find . -name “*.c”
./A.c
./B.c
3.8 빈 디렉토리 또는 크기가 0인 파일 검색
“-empty” 표현식을 사용하여, 빈 디렉토리 또는 크기가 0인 파일을 검색할 수 있습니다.
$ find . -empty # 빈 디렉토리 또는 크기가 0인 파일 검색.
$ find . -name TMP -empty # TMP라는 이름의 빈 디렉토리 또는 크기가 0인 파일 검색.
$ ls
A.c A.h B.c B.h DIR1
$ ls ./DIR1
$ find . -empty
./DIR1
3.9 특정 확장자를 가진 모든 파일 검색 후 삭제
“-delete” 표현식을 사용하여, 검색된 파일 및 디렉토리를 삭제할 수 있습니다. 만약 검색 대상에 디렉토리가 포함된 경우, 디렉토리가 비어 있지 않으면 해당 디렉토리는 삭제되지 않습니다.
$ find . -name “*.EXT” -delete # 확장자 검색 후 파일 삭제.
$ ls
A.c A.h B.c B.h
$ find . -name “*.h” -delete
$ ls
A.c B.c
3.10 검색된 파일 리스트를 줄 바꿈 없이 이어서 출력하기
“-print0” 표현식을 사용하여, 검색 결과를 줄바꿈(newline) 없이 이어서 출력할 수 있습니다.
$ find . -name [FILE] -print0 # 검색된 결과를 줄 바꿈 없이 출력.
$ find . -name [FILE] -print # 검색된 결과를 줄 바꿈으로 구분하여 출력.
$ ls
A.c A.h B.c B.h
$ find . -name “*.h” -print0
./B.h./A.h
3.11 파일 또는 디렉토리만 검색하기
“-type” 표현식을 사용하여, 파일 종류를 지정하여 검색할 수 있습니다.
b : block special
c : character special
d : directory
f : regular file
l : symbolic link
p : FIFO
s : socket
$ find . -name build -type f # build라는 이름의 일반 파일 검색.
$ find . -name PROJ -type d # PROJ라는 이름의 디렉토리만 검색
$ ls
DIR_1 DIR_2 FILE_1 FILE_2
$ find . -name “*_1” -type f
./FILE_1
$ find . -name “*_2” -type d
./DIR_2
3.12 파일 크기를 사용하여 파일 검색.
파일 크기를 사용하여 파일을 찾으려면, “-size” 표현식을 사용합니다.
“-size” 표현식은 기본적으로 block 단위(512B)의 크기를 사용하게 되어 있는데, 파일 크기 값 뒤에 ‘c’ 또는 ‘k’를 붙임으로써 바이트 단위 또는 킬로바이트의 크기 값을 지정할 수 있습니다. (b:block, c:bytes, w:2bytes, k:kbytes, M:mbytes, G:gbytes)
그리고 파일 크기를 비교할 때, “-size” 표현식 두 개를 조합하여 “초과” 또는 “미만”에 대한 내용도 지정할 수 있습니다. 이 때는 크기 값 앞에 +(초과) 또는 -(미만) 기호를 사용합니다.
ex) 1024 바이트보다 크고 2048바이트보다 작은 파일을 검색할 때, “-size +1024c -size -2048c” 표현식을 사용
$ find . -size 1024c # 파일 크기가 1024 바이트인 파일 검색.
$ find . -size +1024c # 파일 크기가 1024 바이트를 초과하는 파일 검색.
$ find . -size -1024c # 파일 크기가 1024 바이트 미만인 파일 검색.
$ find . -size +1024c -size -2048c # 파일 크기가 1024 바이트 초과, 2048 바이트 미만인 파일 검색
$ ls -la
$ find . -size +5c -size -12c
./A.c
./B.c
3.13 검색된 파일에 대한 상세 정보 출력. (find + ls)
“-exec” 표현식은 find 명령으로 검색된 결과를 사용해 다른 명령을 실행할 수 있게 만들어 줍니다.
아래 예제는 find 명령으로 검색된 내용 ls -l 명령으로 전달하여 파일 상세 정보를 표시
$ find . -name “*.c” -exec ls -l {} \; # 현재 디렉토리에서 c 확장자 파일 상세 정보 출력.
$ ls
A.c A.h B.c B.h
$ find . -name “*.c” -exec ls -l {} \;
-rw-r–r– 1 ppotta ppotta 11 Mar 19 01:09 ./A.c
-rw-r–r– 1 ppotta ppotta 11 Mar 19 01:10 ./B.c
3.14 검색된 파일의 라인 수 출력. (find + wc)
find 명령과 wc 명령(Word Count)을 조합하여 검색 파일의 문자 수 또는 라인 수를 계산하여 출력
$ find . -name “*.c” -exec wc -l {} \; # 확장자가 c 인 파일의 라인 수 출력.
$ ls
A.c A.h B.c B.h
$ find . -name “*.c” -exec wc -l {} \;
312 ./A.c
2456 ./B.c
3.15 검색된 파일에서 문자열 검색. (find + grep)
find 명령과 grep 명령을 조합하여, 검색된 파일로부터 특정 문자열 검색
$ find . -name “*.c” -exec grep “main” {} \; # .c 파일에 문자열 main이 있는지 검색.
$ find . -name “*.java” -exec grep -n “class” {} \; # .java 파일에 문자열 class가 있는 라인 표시.
$ find . -name “*.h” -exec grep -n “include” {} \;
1:#include <stdio.h>
3.16 파일 검색 결과를 파일로 저장. (find, redirection)
find 명령의 결과 내용을 표준 출력이 아닌, 파일로 저장하려면 redirection(>)을 사용
$ find . -name “*.c” > source-list.txt # 모든 c 파일 검색 결과를 source-list.txt에 저장.
$ ls
A.c A.h B.c B.h DIR_1
$ find . -name “*.c” > source-list.txt
$ cat source-list.txt
./A.c
./B.c
3.17 검색 중 에러 메시지 출력제외 (find, redirection)
find 명령을 실행할 때, 에러 메시지가 표시되는 경우 redirection을 통해 에러 메시지를 화면에 표시되지 않게 만들 수 있습니다.
표준 에러(2)를 “/dev/null”로 redirection
$ find / -name “*.c” 2> /dev/null # 에러 메시지를 표시하지 않음.
$ ls
A.c A.h B.c B.h DIR_1
$ find / -name “A.c”
…
find: ‘/sys/kernel/debug’: Permission denied
/home/ppotta/A.c
find: ‘/sys/fs/pstore’: Permission denied
…
$ find / -name “A.c” 2> /dev/null
/home/ppotta/A.c
3.18 하위 디렉토리 검색 제외
기본적으로 find 명령은 하위 디렉토리까지 모두 탐색. “-maxdepth” 표현식을 사용하면 검색할 하위 디렉토리의 깊이를 제한할 수 있습니다.
“-maxdepth”는 다른 표현식보다 앞에 사용
$ find / -maxdepth 1 -name “sys” # sys라는 파일을 루트(/) 디렉토리에서만 검색.
$ find / -name “sys”
find: ‘/root’: Permission denied
find: ‘/var/spool/cups’: Permission denied
…
$ find / -maxdepth 1 -name “sys”
/sys
3.19 검색된 파일 복사. (find + cp)
find 명령과 cp 명령을 조합, 검색된 파일을 지정된 디렉토리로 복사
$ find . -name “*.tar.gz” -exec cp {} /mnt/usb/ \; > tar.gz 파일을 /mnt/usb/ 에 복사
[출처] 개발자를 위한 레시피 Go