SRE/Linux Basics

find

게임이 더 좋아 2022. 12. 7. 13:54
반응형
728x170

정의

file을 찾아주는 명령어

 

 


기본 포맷

find [target directory] [option] [expression]

 

**상대 경로, 절대 경로 모두 가능

** Linux에서는 인자 값을 생략한다면 현재 디렉토리(.) 입력 받은 것으로 간주 But Unix 에서는 오류


용도

파일을 찾는데 주로 쓰이며 파일의 옵션을 넣어 원하는 파일들을 얻어낸다.

수많은 예시들이 존재함

 

################################################################# -name (파일 이름)

# 현재 디렉토리에서 .txt 확장자 모두 찾기
find . -name "*.txt"

# 현재 디렉토리에서 .txt 확장자 파일 검색 후 모두 삭제
find . -name "*.txt" -delete

# 현재 디렉토리에서 test로 시작되는 파일 찾기
find . -name "test*"

# 현재 디렉토리에서 test가 포함되는 파일 찾기
find . -name "*test*"

# 현재 디렉토리에서 test로 끝나는 파일 찾기
find . -name "*test"

#현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시
find

#대상 디렉토리에 있는 파일 및 디렉토리 리스트 표시
find [target_directory]

#전체 시스템(루트 디렉토리)에서 파일 검색
find / -name [FILE]

#하위 디렉토리에 존재하는 파일 갯수
find */ | cut -d/ -f1 | uniq -c



############################################################## 파일 내용(파일 명 x)

#특정 문자를 포함하는 파일 찾기와 그 문자가 속한 행 찾기
find [target_directory] -type f -exec egrep -i "특정 문자" /dev/null {} \;

#검색된 파일의 라인 수 출력. (find + wc)
find . -name [FILE] -exec wc-l {} \;

#검색된 파일에서 문자열 찾기. (find + grep)
find . -name [FILE] -exec grep "STR" {} \;

#검색된 파일의 상세정보 출력 (ls 명령 실행)
find . -name [NAME] -exec ls -al {} \;




############################################################### -type (파일 타입)

# 현재 디렉토리에서 모든 디렉토리 찾기
find . -type d

# 현재 디렉토리에서 test가 들어가는 디렉토리 찾기
find . -name "*test*" -type d

# 현재 디렉토리에서 모든 파일 찾기
find . -type f


################################################################ -empty, -size (파일 크기)

# 현재 디렉토리에서 빈 디렉토리이거나 크기가 0인 파일 검색
find . -empty

# 현재 디렉토리에서 test가 들어가는 빈 디렉토리이거나 크기가 0인 파일 검색하여 삭제
find . -name "*test*" -empty -delete

# 현재 디렉토리에서 1024byte인 파일 검색
find . -size 1024c

# 현재 디렉토리에서 1024byte보다 큰 파일 검색
find . -size +1024c

# 현재 디렉토리에서 1024byte보다 작은 파일 검색
find . -size -1024c

# 현재 디렉토리에서 1kb보다 크고 10kb보다 작은 파일 검색
find . -size +1k -size -10k



########################################################### -exec (검색된 파일에서 추가 작업)

# 현재 디렉토리에 "test"가 들어가는 파일을 찾아서 상세정보 출력
find . -name "*test*" -exec ls -l {} \;

# 현재 디렉토리에 있는 파일에서 "test"가 들어가는 내용 찾기
find . -type f -exec grep "test" {} \;

# 현재 디렉토리에 ".txt" 확장자를 찾아서 모두 삭제
find . -name "*.txt" -exec rm {} \;




###################################################### 파일 일자


#a.txt파일 이후 생성된 파일검색 후 출력
find . -newer a.txt

#현재 디렉토리로부터 이름이 *.txt인 파일 출력
find . -name "*.txt"

#지정된 날짜 이후에 변경된 모든 파일 찾기 (아래의 예시에선 2일 전부터 지금까지의 변경된 파일
find / -used 2 -exec ls -l {} \;






###################################################### 파일 mode
  
#퍼미션이 777인 파일 출력
 find . -perm 777 -print







################################################### ID, 사용자

#특정 사용자 ID 소유의 파일 찾기
find . -user test –print

#특정 UID소유의 모든 파일찾기
find . -uid 500 -exec ls -l {} \;

#특정사용자의 ID소유로 된 모든 파일 찾기
find / -user test -print

#특정 사용자의 홈디렉토리 내에서 특정 파일 찾기
find /home/test -name *.html -print

#특정 유저의 시스템내의 특정 파일들을 검색하여 삭제하는 방법
#{} : 찾아진 파일들이 차례대로 치환됨, 찾아진 개수만큼 -exec명령어가 실행
find ~test -name *.bak -exec rm -f {} \;

#지정된 소유자의 모든 파일을 찾아서 확인하기
find / -user test -exec ls -l {} \;

#특정 디렉토리(유저 경로도 가능)존재하는 모든 디렉토리 목록만 확인
find /home/test -type d -print





####################################################### depth 조절

#하위 디렉토리 검색하지 않기
find . -maxdepth 1 -name [FILE]





###################################################### stdoutput

#검색 결과를 파일로 저장. (find, redirection)
find . -name [FILE] > [SAVE_FILE]

#검색된 파일로 압축파일 생성 (tar 명령 실행)
find . -name [NAME] -exec tar -xcvf [파일명] {} \;

#검색된 파일을 특정 [경로]로 복사 (cp 명령 실행)
find . -name [NAME] -exec cp {} [경로] \;





################################################### exec 논리 연산자 사용

#파일타입이 아닌 것들만 찾기
find ! -type f

 

예시2

find /etc -name "*.conf"  => /etc 디렉터리 하위에서 .conf로 끝나는 파일들 검색

find /home -user newuser1 => /home 디렉터리 밑에서 파일 소유자가 newuser1인 파일들 검색

find ~ -perm 644 => 현재 디렉터리(pwd)에서 허가권한이 644인 파일들 검색

find /usr/bin -size + 10k -size -100k  => 파일 크기가 10KB ~ 100KB 인 파일들 검색

find ~ -size 0k -exec ls -l { } \; => 현재 디렉터리에서 파일크기가 0인 파일을 출력(exec 뒤의 커맨드)

find /home -name "*.swp" -exec rm { } \;  => home디렉터리 밑에서 .swp로 끝나는 파일 전부 지움

 

더보기

현재 디렉토리에 있는 파일 및 디렉토리 리스트 표시 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] \;

 

find /home -name "*.swp" -exec rm { } \;  라고 하면

 -exec rm { find /home -name "*.swp"} \;  라고 이해하면 된다.

즉, find로 찾은 파일을 삭제하겠다는 뜻이다. 그래서 중괄호가 비어있다.

 

만약 파일이름을 바로 알고 있다?? 다르게 찾을 수 있다.

which gzip   => 바로 절대 경로가 나온다 (pwd 디렉터리 하위에 있으면 나옴)

whereis gzip => gzip이 포함된 모든 파일 검색

locate gzip  =>  파일목록 데이터베이스에서 빠르게 찾지만 파일 변경시 updatedb를 해야 갱신되고
빨리 찾을 수 있다. locate는 mlocate 패키지가 있어야 사용가능하다.

 

 

 


Options

 


Expression

 

** -exec 옵션의 제일 끝에 구분자는 +  \; 이렇게 두 가지로 나누어져 있는데 무엇을 쓰든 크게 차이나지는 않는다.

 

 

 

 


표현식에 적용하는 연산

 

 

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

 

 

 

 

 

 


참고링크

 

https://izigom.tistory.com/entry/find-find-%EC%98%B5%EC%85%98-%EC%B4%9D%EC%A0%95%EB%A6%AC

https://coding-factory.tistory.com/804

https://recipes4dev.tistory.com/156

 
728x90
반응형
그리드형

'SRE > Linux Basics' 카테고리의 다른 글

awk  (0) 2022.12.07
Proxy  (0) 2022.12.07
실시간 모니터링  (0) 2022.12.07
네트워크 모니터링  (0) 2022.12.07
I/O 모니터링  (0) 2022.12.07