2swan

Linux find 명령어(2) 본문

System of Infra/Linux

Linux find 명령어(2)

2swan 2024. 4. 26. 15:49

파일/디렉터리 검색

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

$ find [PATH] [OPTION] [EXPRESSION]

 

find 표현식(expression) 

-name 주어진 이름의 파일이나 디렉터리를 찾는다
$ find -name '*.txt'
현재 디렉터리 이하의 모든 디렉터리에서 .txt로 끝나는 파일 및 디렉터리를 찾는다.
-user 지정한 사용자의 파일이나 디렉터리를 찾는다.
-group 지정한 그룹 소유의 파일이나 디렉터리를 찾는다.
-uid 지정한 UID 소유의 파일이나 디렉터리를 찾는다.(아이디 번호로 찾기)
-gid 지정한 UID 소유의 파일이나 디렉터리를 찾는다.(그룹번호로 찾기)
-perm 지정한 허가권 값을 갖는 파일이나 디렉터리를 찾는다.(permission의 약자)

ex) -perm 800 : 퍼미션 값이 800로 설정된 파일이나 디렉터리
-atime n n : n일 이전에 접근한 파일 찾기 (exactly)
+n : n보다 오래된 녀석들 기준 (greater)
-n : n일부터 지금까지 n일 내에 접근했던 파일들을 불러준다 (less)
-ctime n change time 수정 시간 기준으로 찾는다
-mtime n modify time 변경 시간 기준으로 찾는다
-empty 빈 파일(파일의 크기가 0일 경우)이나 빈디렉터리일 경우 출력
-inum n node번호가 n인 파일 찾

 

 

* find 명령에서 두 개 이상의 표현식을 사용할 때 연산자를 지정하지 않으면, 기본적으로 -a (AND)가 적용된다.

# 같은 명령어
find -empty -print
find -empty -a print

 

 

파일명으로 찾기 (-name)

$ find

현재 디렉터리의 파일 및 디렉토리 출력

 

$ find -print

현재 디렉터리의 모든 내용을 줄 바꿈 없이 출력

 

$ find . empty

현재 경로 하위에서 빈 디렉터리 혹은 크기가 0인 파일 검색

 

$ find [PATH]

PATH에 있는 파일 및 디렉터리 리스트 표시

 

$ find . -name [FILENAME]

현재 디렉터리 아래 모든 파일 및 디렉터리 검색.

 

$ find . -iname [FILENAME]

name앞에 i를 붙여주게 되면 대소문자 구분없이 검색.

 

$ find ~ -name [FILENAME]

사용자의 홈디렉터리 하위에서 파일이름 검색

 

$ find . -name 'STR*'

지정된 문자열로 시작하는 파일 검색

 

$ find . -name '*STR * '

지정된 문자열이 포함된 파일 검색

 

$ find . -name ' * STR'

지정된 문자열로 끝나는 파일 검색

 

$ find . -name 'B*'

B로 시작하는 파일 검색

 

$ find /user -name '*.txt'

/user 디렉터리에서 txt 파일이름으로 끝나는 파일이름 검색

 

$ find . -name '*.EXT' -delete

확장자 검색 후 파일 삭제

 

타입으로 찾기 (-type)

$ find . -name [NAME] -type f,d,l

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

 

※ -type 종류

  b : block special

  c : character special

  d : directory

  f : regular file

  l : symbolic link

  p : FIFO

  s : socket

 

$ find . -name dog -type f

dog라는 이름의 일반 파일 검색.

 

$ find . -name ABCD -type d

ABCD 라는 이름의 디렉터리만 검색

 

 

파일 크기로 찾기 (-empty, -size)

$ find . -size +[SIZE1]c -size -[SIZE2]c

현재 경로 하위에서 파일 사이즈로 검색

 

 

$ find . -size 1024c

파일 크기가 1024 바이트인 파일 검색.

 

$ find . -size +1024c

파일 크기가 1024 바이트를 초과하는 파일 검색

 

$ find . -size -1024c

파일 크기가 1024 바이트 미만인 파일 검색

 

$ find . -size +1024c -size -2048

파일 크기가 1024 바이트 초과 2048 바이트 미만인 파일 검색

 

$ find . -type d -size +100

. 현재 디렉터리에서 타입이 d(디렉터리)인 파일들 중에 사이즈가 100이상인걸 검색

 

검색 결과 나열하는 방법 (-print / -print0)

일반적으로 print가 기본 옵션이고 별도로 지정해주지 않으면 -print가 들어간다.

-print0을 사용하면 각 결과는 null 문자(\0)로 끝나며 파일이나 디렉터리 이름에 newline이나 공백이 들어가 있는 경우에도 정확하게 처리할 수 있

 

$ find ./ -name "*.bak" -print

$ find ./ -name "*.bak" -print0

 

 

검색된 파일에서 추가 명령 실행 (-exec)

{} : find 에서 찾아낸 검색 결과가 하나씩 들어가는 부분

\; : -exec 다음부분에 나와있는 명령어를 실행하라는 부분

 

$ find . -name "*.c" -exec ls -l {} \;

현재 디렉터리에서 c 확장자 파일 상세 정보 출력 (ls 명령)

 

$ find . -name "*.c" -exec grep "main" {} \;

.c 파일에 문자열 main이 있는지 검색 (grep 명령)

 

$ find . -name "*.java" -exec grep -n "class" {} \;

.java 파일에 문자열 class가 있는 라인 표시.

 

$ find . -name "*.tar.gz" -exec cp {} /mnt/usb/ \;

검색된 파일을 특정 [경로]로 복사 (cp 명령 실행) > tar.gz 파일을 /mnt/usb/ 에 복사

 

$ find . -name "*.c" > source-list.txt

모든 c 파일 검색 결과를 source-list.txt에 저장 (입출력 재지정 redirection ">" 실행)

 

$ find / -name "*.c" 2> /dev/null

에러 메시지를 표시하지 않음

 

$ find . -name [NAME] -exec tar -xcvf [파일명] {} \;

검색된 파일로 압축파일 생성 (tar 명령 실행)

 

$ find test -perm 664 -exec rm {} \;

test 디렉터리에서 권한이 rw-rw-r-- 인 파일을 find해서 (rm 명령 수행)

 

* 구분자 + 와 \; 차이

-exec 옵션의 제일 끝에 구분자는 +와 \; 두 가지로 나뉘어져 있으며 성능 면에서 + 가 좋다고 알려져 있다.

\; 를 마지막 구분자로 사용하면 각 파일에 대해 별도의 프로세스를 실행하게 되는데 이로 인해, RPM과 처리 시간 모두에서 심각한 패널티가 발생할 수 있기 때문이다.

 

구분자 더하기 기호 + 사용하면 모든 표현식의 결과가 연결되어 전체적으로 한 번만 실행되는 -exec 명령에 전달된다.

 

$ find -name '파일명*' -exec tar -cvfz 파일명.tar.gz {} \;

$ find -name '파일명*' -exec tar -cvfz 파일명.tar.gz {} +

 

특정 파일 권한을 가진 파일을 검색(-perm)

$ find . -perm 0664

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

 

$ find test -perm 664 -exec rm {} \;

test 디렉터리에서 권한이 rw-rw-r-- 인 파일을 find해서 rm 명령 수행

 

정규표현식 패턴으로 파일명 검색 (-regex)

$ find . -regex ".*/[0-9]+.txt"

파일 이름이 숫자.txt 인 것들

 

특정 시간 이후/이전 수정된 파일(-mtime, -atime, -ctime)

# 현재 12월 12일 이라고 가정

$ find -mtime -3

3일(72시간)보다 새로움 => 12.9 ~

 

$ find -mtime 3

4일(96시간) 전에서 3일(72시간)전까지 => 12.8 ~ 12.9

 

$ find -mtime +3

4일(96시간)전보다 과거 => 12.8

 

하위 디렉터리 무시 (-prune)

$ find . -name "*.문자*" -prune

 

 

서브 디렉터리 내용 제한 검색 (-depth)

-maxdepth 1 : 최대 디렉터리 한 단계만

-mindepth 1 : 명령행 지정된 경로(한 단계)를 제외하고 찾기

 

$ find . -maxdepth 1 -name [NAME]

현재 경로에서만 [NAME] 검색 (하위 디렉터리 미포함)