우클릭방지

글 목록

2017년 8월 31일 목요일

리눅스 find 명령어 사용법 #1 - 검색

리눅스 시스템에서 자주 사용되는 명령어 중 find 라는 명령어가 있다.
find 명령어는 영어 글자 의미 그대로 파일이나 디렉토리를 검색하기 위한 목적으로 사용된다.

보통 파일 검색하는 조건이 다음 범위내에 있을것이라 본다.

  • 특정 파일명을 찾고자 하는 경우
  • 특정 디렉토리를 찾고자 하는 경우
  • 특정 권한을 가진 파일을 찾고자 하는 경우
  • 특정 소유자의 파일을 찾고자 하는 경우
  • 특정 그룹의 파일을 찾고자 하는 경우
  • 특정 용량(사이즈) 기준의 파일을 찾고자 하는 경우
  • 특정 시간 기준의 파일을 찾고자 하는 경우
  • 파일 내용에 특정 문자열이 포함된 파일을 찾고자 하는 경우
위 나열된 조건에 해당되는 파일을 찾고자 했거나, 혹은 하려는 분들에게 도움을 드리고자 내용을 정리해 본다. 

먼저 find 명령어는 다음과 같은 형식을 가진다. 

find [찾고자 하는 디렉토리 경로] [옵션] 

바로 옵션에 어떤 것을 사용하느냐에 따라 위에서 우리가 필요로 하는 조건을 만족시키는 결과를 찾아낼 수가 있는 것이다. 

자.. 일단 이해를 쉽게 하는 차원에서 다음과 같이 temp 디렉토리에 테스트 파일을 만들었다. 총 12개의 파일이 존재하며 파일의 생성시간은 2017년 매월 1일이다.




위 12개의 파일 가지고 위 8가지 경우에 대해 확인해 보도록 한다.

1. 특정 파일명을 찾고자 하는 경우

사용법 : find [디렉토리] -name '[파일명]' 

사용예

#1 현재 디렉토리에서 1mon.txt 파일을 찾으려는 경우
명령어 : find . -name '1mon.txt'


find 명령어 다음 디렉토리를 명시해야 하는 부분에 "." 을 적은 것은 다들 이해하고 있으리라 본다.
"." 은 현재 디렉토리라는 뜻이며 "./" 와 같이 표시해도 된다.

(참고로.. 명령어 제일 마지막에 '-ls'는 결과를 ls -l 과 같은 형태로 표시하라는 의미이다.)

#2 현재 디렉토리에서 txt 확장자를 가지고 있는 파일을 모두 찾으려는 경우
명령어 : find . -name '*.txt"


#3 현재 디렉토리에서 1로 시작되는 파일명을 가진 것을 찾으려는 경우
명령어 : find . -name '1*' 


2. 특정 디렉토리를 찾고자 하는 경우

이는 파일명을 찾는 것과 사용법이 거의 같으나, "-type d" 라는 옵션만 하나 추가된다.

사용법 : find [디렉토리] -type d -name '[디렉토리명]' 

사용예

#1 루트에서 temp 디렉토리를 찾고자 하는 경우
명령어 : find / -type d -name 'temp'


#2 루트에서 디렉토리명에 tar이 포함되는 경우
명령어 : find / -type d -name '*tar*'


3. 특정 권한을 가진 파일을 찾고자 하는 경우

이는 파일명을 찾는 것과 사용법이 거의 같으나, "-perm 777" 과 같은 옵션만 하나 추가된다.  (perm 은 permission 의 약자이다.)

사용법 : find [디렉토리] -perm [권한숫자] -name '[파일명]' 

사용예

#1 현재 디렉토리에서 777 권한을 가진 파일 찾기
명령어 : find . -perm 777 


#2 현재 디렉토리에서 777 권한을 가진 12mon.txt 파일 찾기
명령어 : find . -perm 777 -name '12mon.txt'


4. 특정 소유자의 파일을 찾고자 하는 경우

이는 파일명을 찾는 것과 사용법이 거의 같으나, "-user [사용자명]" 과 같은 옵션만 하나 추가된다.

사용법 : find [디렉토리] -user [사용자명] -name '[파일명]' 

사용예

#1 현재 디렉토리에서 jhkim 사용자의 소유권이 있는 파일 찾기
명령어 : find . -user jhkim


#2 현재 디렉토리에서 jhkim 사용자의 소유권이 있는 11mon.txt 파일 찾기
명령어 : find . -user jhkim -name '11mon.txt'







5. 특정 그룹의 파일을 찾고자 하는 경우

이는 파일명을 찾는 것과 사용법이 거의 같으나, "-group [그룹명]" 과 같은 옵션만 하나 추가된다.

사용법 : find [디렉토리] -group [그룹명] -name '[파일명]' 

사용예

#1 현재 디렉토리에서 root 그룹의 소유권이 있는 파일 찾기
명령어 : find . -group root


#2 현재 디렉토리에서 root 구룹의 소유권이 있는 8mon.txt 파일 찾기
명령어 : find . -group root -name '8mon.txt'



6. 특정 용량(사이즈)의 파일을 찾고자 하는 경우

이는 파일명을 찾는 것과 사용법이 거의 같으나, "-size [용량]" 과 같은 옵션만 하나 추가된다.

사용법 : find [디렉토리] -size [용량] -name '[파일명]' 

*size 옵션 뒤에 용량 표기는 다음과 같이 할 수 있다.
. c : 바이트
. k : 키로바이트
. M : 메가바이트
. G : 기가바이트

사용예

#1 현재 디렉토리에서  2 바이트 이상 되는 파일 찾기
명령어 : find . -size +2c 


#2 루트 디렉토리에서 1024 바이트(1 Kbyte) 이상 되는 파일 찾기
명령어 : find / -size +1024c      또는 find / -size +1k


위 예에서는 결과 출력이 너무 많아서 명령어 마지막에 " | more" 를 사용했다.

#3 루트 디렉토리에서 1k 이상 2k 미만 되는 파일 찾기 (용량 범위 파일 검색)
명령어 : find / -size +1k -size 2k  (두번째 size에 - 부호가 없는것을 유의하자)



7. 특정 시간 기준의 파일을 찾고자 하는 경우

먼저 시간옵션을 이해하는게 중요하다.
리눅스에서는 다음과 같이 시간을 3가지로 구분한다.

  1. atime : access time
    마지막으로 파일에 접근한 시간, vi 또는 cat 등의 명령어로 열람한시간이 이에 해당
  2. ctime : change time
    마지막으로 chmod나 chown등으로 파일의 속성 및 권한을 변경한 시간
  3. mtim : modification time
    마지막으로 파일의 내용을 수정한 시간

보통 ls -l 로 확인하는 시간은 mtime 이다.
atime은 ls -lu 명령어로 확인 가능하고...
ctime은 ls -lc 명령어로 확인이 가능하다.

조금 이해가 되었을 것이다.
그럼 위 3가지 시간옵션을 가지고 활용을 해보자.

사용법 : find [디렉토리] -atime / -mtime / -ctime [시간옵션] -name '[파일명]'

* 시간옵션의 기본 단위는 24시간(하루)이다.
예를들어 -mtime 2  의 의미는 수정된지 48시간(2일)이 된 파일이다.

사용예

#1 현재 디렉토리에서  마지막으로 수정된지 2달 이상된 파일 찾기
명령어 : find . -mtime +60 


#2 현재 디렉토리에서 마지막으로 수정된지 5달 이상된 txt 확장자를 가진 파일 찾기
명령어 : find . -mtime +150 -name '*.txt" 


#3 /etc 디렉토리에서 파일의 속성을 변경한지 2달 이상된 파일 찾기
명령어 : find /etc -ctime +60 







8. 파일 내용에 특정 문자열이 포함된 파일을 찾고자 하는 경우

이것을 하려면 두가지 명령어를 합쳐서 수행해야 한다.
조금 복잡할 수 있겠으나, 자세히 들여다 보면 크게 어렵지 않으니 가볍게 내용을 보면 좋겠다.

명령어 수행은 다음 순으로 진행되는 것으로 이해하면 된다.
  ㄱ. 특정 디렉토리의 파일들을 모두 검색한다.
  ㄴ. 검색된 파일들의 내용을 일일히 문자열과 비교하여 매치되는 것을 찾아낸다.

위 2가지를 합쳐서 하나의 명령어로 하면.. 다음과 같다.

사용법 : find [디렉토리] -type f -exec grep '[찾고자 하는 문자열]' /dev/null {} \;

테스트로 사용하고 있는 12개의 파일에는 각각 그 달(month)를 의미하는 영어 약자가 포함되어 있다.

1mon.txt 에는 Jan 가... 2mon.txt 에는 Feb 가...
이런식으로.. 12mon.txt 에는 Dec 가 내용으로 입력되어 있다.

#1 현재 디렉토리에서 Aug 단어를 포함하는 파일 찾기
명령어 : find . -type f -exec grep 'Aug' /dev/null {} \;



여기까지 find 명령어를 이용해서 내가 원하는 형태의 파일을 어떻게 찾을 수 있는지 알아보았다. 

참고로 위 8가지 조건은 다양한 형태로 and 조건화 하여 같이 사용이 가능하다. 

예를 들어.. 

#1 현재 디렉토리에서 마지막으로 수정된지 4달 이상된 파일 중 사이즈가 2바이트 이상이며 소유자는 jhkim 인 파일을 찾는 경우
명령어 : find . -mtime +120 -size +2c -user jhkim


결과는 1mon.txt 파일이다. 아래 파일 목록을 보고 조건에 잘 맞게 검색이 되었는지 확인해 보면 좋겠다. 

이렇듯 막강한 검색 명령어 find...  윈도우에서 이런것을 수행하려면 별도의 프로그램을 통해야 하지만.. 리눅스에서는 기본으로 제공하고 있으니.. 참 좋은듯 싶다. 

끝~

* find 명령어 검색 결과 대상 2차 명령 실행(아래 예의 경우)은 다음 강좌에서 자세히 다룬다. (-exec 옵션 활용 법)

  • 검색 결과를 모두 지우기
  • 검색 결과를 모두 다른 폴더로 이동하기 등..

=> 여기 를 클릭하여 다음 강좌로 이동하기 

댓글 없음:

댓글 쓰기