정의
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