find
리눅스에서 파일 및 디렉토리를 검색할 때 사용하는 명령어
리눅스에서 접근할 수 있는 파일 시스템에서, 파일 및 디렉토리를 "찾는 (find)" 것
find 명령 사용 예제
현재 디렉토리 내에서 지정된 이름의 파일을 찾는 것은 간단함
find 명령 뒤에 파일 이름을 지정하기만 하면 됨
$ ls
FILE_1 FILE_2 FILE_3
$ find FILE_1
FILE_1
일반적으로 리눅스 파일 시스템은 그 구조가 매우 복잡함
현재 디렉토리에 있는 파일을 찾기 위해 find 명령을 사용하는 경우는 드물고,
지정된 디렉토리에 포함된 디렉토리 및 패턴으로 지정된 파일 이름으로 파일을 찾는 경우가 많음
$ find . -name "FILE"
이 명령의 의미는 "현재 디렉토리(.)에서 'FILE' 이라는 이름을 가진 (-name 'FILE') 파일을 찾아라"임
검색되는 경로는 현재 디렉토리와 현재 디렉토리에 포함된 하위 디렉토리를 모두 포함함
find 사용 예 | 명령어 옵션 |
현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시 | find |
대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시 | find [PATH] |
현재 디렉토리 아래 모든 파일 및 하위 디렉토리에서 파일 검색 | find . -name [FILE] |
전체 시스템(루트 디렉토리)에서 파일 검색 | find / -name [FILE] |
파일 이름이 특정 문자열로 포함된 파일 검색 | 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] \; |
현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시
아무런 옵션없이 find 명령만 사용하면 현재 디렉토리(하위 디렉토리 포함)에 있는 모든 파일과 디렉토리 표시
주로 디렉토리 파일 리스트를 다른 명령으로 전달하여 처리하고자 할 때 사용함
$ find # 현재 디렉토리의 파일 및 디렉토리 출력
$ find -print0 # 현재 디렉토리의 모든 내용을 줄 바꿈 없이 출력
$ find
.
./FILE_1
./DIR_1
./DIR_1/FILE_1
./DIR_1/FILE_2
./DIR_1/FILE_3
./FILE_2
./FILE_3
대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시
find 명령 다음에 디렉토리를 지정하여, 대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시
$ find [PATH] # PATH에 있는 파일 및 디렉토리 리스트 표시
$ find . -name "FILE_1"
./FILE_1
./DIR_1/FILE_1
현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시
현재 디렉토리에 포함된 모든 하위 디렉토리 및 파일에서 지정된 파일을 검색
$ find . -name [NAME] # 현재 디렉토리 아래 모든 파일 및 디렉토리 검색
$ find . -name "FILE_1"
./FILE_1
./DIR_1/FILE_1
전체 시스템(루트 디렉토리)에서 파일 검색
디렉토리 경로를 루트(/)로 지정하여 전체 시스템 중 특정 파일 검색
$ find / -name [NAME] # 루트 디렉토리에서 파일 이름으로 검색
$ find / -name "FILE_1"
/home/root/FILE_1
/home/root/DIR_1/FILE_1
파일 이름이 특정 문자열로 시작하는 파일 검색
찾을 파일 이름에 와일드 카드(*) 문자를 포함하여 특정 문자열로 시작하는 파일 검색
$ find . -name "STR*" # 지정된 문자열로 시작하는 파일 검색
$ ls
A_FILE B_FILE C_FILE
$ find . -name "B*"
./B_FILE
파일 이름에 특정 문자열이 포함된 파일 검색
찾을 파일 이름 시작과 끝에 와일드 카드(*) 문자를 포함하여 특정 문자열이 포함된 파일 검색
$ find . -name "*STR*" # 지정된 문자열이 포함된 파일 검색
$ ls
A_FILE B_FILE C_FILE
$ find . -name "*IL*"
./B_FILE
./C_FILE
./A_FILE
파일 이름이 특정 문자열로 끝나는 파일 검색 (파일 확장자로 검색)
찾을 파일 이름 시작과 끝에 와일드 카드(*) 문자를 포함하여 특정 문자열이 포함된 파일 검색
확장자가 일치하는 파일을 검색할 때 유용
$ find . -name "*STR" # 지정된 문자열로 끝나는 파일 검색
$ ls
A.c A.h B.c B.h
$ find . -name "*.c"
./A.c
./B.c
빈 디렉토리 또는 크기가 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
특정 확장자를 가진 모든 파일 검색 후 삭제
"-delete" 표현식을 사용하여, 검색된 파일 및 디렉토리를 삭제
만약 검색 대상에 디렉토리가 포함된 경우, 디렉토리가 비어 있지 않으면 해당 디렉토리는 삭제되지 않음
$ find . -name "*.EXT" -delete # 확장자 검색 후 파일 삭제
$ ls
A.c A.h B.c B.h
$ find . -name "*.h" -delete
$ ls
A.c B.c
검색된 파일 리스트를 줄 바꿈 없이 이어서 출력
"-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
파일 또는 디렉토리만 검색
"-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 f
./DIR_2
파일 크기를 사용하여 파일 검색
$ find . -size 1024c # 파일 크기가 1024 바이트인 파일 검색
$ find . -size +1024c # 파일 크기가 1024 바이트를 초과하는 파일 검색
$ find . -size -1024c # 파일 크기가 1024 바이트 미만인 파일 검색
$ find . -size +1024c size -2048c # 파일 크기가 1024 바이트 초과, 2048 바이트 미만인 파일 검색
$ ls -la
total 44
dr-xr-x---. 15 root root 4096 Jan 16 17:09 .
dr-xr-xr-x. 18 root root 238 Jan 15 13:29 ..
-rw-------. 1 root root 11 Jan 15 12:57 A.c
-rw-------. 1 root root 3 Jan 16 17:09 A.h
-rw-r--r--. 1 root root 11 Dec 29 2013 B.c
-rw-r--r--. 1 root root 3 Dec 29 2013 B.h
$ find . -size +5c -size -12c
./A.c
./B.c
검색된 파일에 대한 상세 정보 출력 (find + ls)
"-exec" 표현식은 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-------. 1 root root 11 Jan 15 12:57 A.c
-rw-r--r--. 1 root root 11 Dec 29 2013 B.c
검색된 파일의 라인 수 출력 (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
검색된 파일에서 문자열 검색 (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>
파일 검색 결과를 파일로 저장 (find, redirection)
find 명령과 grep 명령을 조합하여, 검색된 파일로부터 특정 문자열 찾기
$ find . -name "*.c" > source-list.txt # 모든 c 파일 검색 결과를 source-list.txt에 저장
$ ls
A.c A.h B.c B.h DIR_1
$ find . -name "*.c" > soucre-list.txt
$ cat source-list.txt
./A.c
./B.c
검색 중 에러 메세지 출력하지 않기 (find, redirection)
find 명령을 실행할 때, 실행 결과와 별개로 에러 메세지가 표시되는 경우가 있음
디렉토리 접근 권한 문제로 인해 "Permission denied" 에러 메세지가 화면을 가득 채우게 되면,
실제 검색 결과를 확인하기가 어렵게 됨
$ 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/root/A.c
find: 'sys/fs/pstore': Permission denied
...
$ find / -name "A.c" 2> /dev/null
/home/root/A.c
하위 디렉토리 검색하지 않기
find 명령은 하위 디렉토리까지 모두 탐색함
"-maxdepth" 표현식을 사용하면 검색할 하위 디렉토리의 깊이 제한 가능
$ find / -maxdepth 1 -name "sys" # sys 라는 파일을 루트(/) 디렉토리에서만 검색
$ find / -name "sys"
find: '/root': Permission denide
find: '/var/spool/cups': Permission denied
...
$ find / -maxdepth 1 -name "sys"
/sys
검색된 파일 복사 (find + cp)
find 명령과 cp 명령을 조합하여, 검색된 파일을 지정된 디렉토리로 복사
$ find . -name "*.tar.gz" -exec cp {} /mnt/usb/ \; # tar.gz 파일을 /mnt/usb 에 복사