1/07/2015

find 검색

1. Find 기본사용법

find는 원하는 file을 찾을 경우 사용하며, file정보를이용하여 검색하기 때문에 grep보다 빠른 검색가능하다.


SYNOPSIS
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]


1.1.  Find 의 옵션  

Find는 FILE의 정보기준으로 검색을 하며, 다양한 옵션들을 제공하여 빨리 원하는 FILE들을 찾아준다.

  • Find 기본연산옵션
  1. FILE의 이름관련 연산
  2. FILE의 시간관련 연산 
  3. FILE의 사이즈관련 연산
  4. AND/OR/NOT 연산제공 :  상위 1/2/3번의 조합이 가능 

**SIZE 관련 연산

       -size n[cwbkMG]
              File uses n units of space.

              `b'    for 512-byte blocks (this is the default if no suffix is used)
              `c'    for bytes
              `w'    for two-byte words
              `k'    for Kilobytes (units of 1024 bytes)
              `M'    for Megabytes (units of 1048576 bytes)
              `G'    for Gigabytes (units of 1073741824 bytes)

**TIME 관련 연산  (time: 기본단위는 24*hours , min:  minutes)

        -mtime  n : modified n days ago         (파일의 내용을 변경시 )
        -mmin   n : modified minutes ago
        -atime  n : access   n days ago         (파일을 오픈했을 경우, cat, vi, grep, head )
        -amin   n : access   minutes ago  
        -ctime  n : changed  n days ago          (파일의  속성이 변경시)
        -cmin   n : changed  minutes ago

**SIZE/TIME의 숫자개념 

         -n  :  for less  than  ( < n )
         +n  :  for great than  ( > n )
          n  :  for exactly n   (  n )

상위 FILE의 SIZE 및 TIME 연산의 AND/OR/NOT 연산가능

**AND OR 연산 및 NOT 연산 

       -not expr
              Same as ! expr, but not POSIX compliant.

       expr1 expr2
              Two expressions in a row are taken to be joined with an implied "and"; expr2 is not evaluated if expr1 is false.

       expr1 -a expr2
              Same as expr1 expr2.

       expr1 -and expr2
              Same as expr1 expr2, but not POSIX compliant.

       expr1 -o expr2
              Or; expr2 is not evaluated if expr1 is true.

       expr1 -or expr2
              Same as expr1 -o expr2, but not POSIX compliant.

       expr1 , expr2
              List;

  • Find의 기타옵션 
  1. 다른 command 실행연산
  2. FILE 검색결과의 출력방법


**실행연산

       -exec command ;

**output 종류 

newline을 사용여부 및 프로그래밍으로 output을 만들수 있다 이 부분 man을 참고

       -print0
              True; print the full file name on the standard output, followed by a null character

       -print True; print the full file name on the standard output, followed by a newline.

       -printf format
              True;  print  format  on  the standard output,

              %p     File's name.

              %P     File's name with the name of the command line argument under which it was found removed.

              %s     File's size in bytes.

              %b     The amount of disk space used for this file in 512-byte blocks.

              %k     The amount of disk space used for this file in 1K blocks.


2. Find 예제 


2.1 FILE의 이름기준 검색 


* : 여러글자 대체
? : 한글자만 대체
[1-8] : 한글자만 정의 (1~8)
[a-c] : 한글자만 정의 (a~c)

$ find . -name  expr// 원하는 검색어 
$ find . -name '*.o'   // *.o 파일 검색  (가능하면 '' or ""사용) 
$ find . -name *.h    // *.h  파일 검색
$ find . -name *droid-[2-5]*  // android-2/4/5 검색
$ find . -name *droid-[2-5].[0-1]*  //e.g android-2.0 검색
$ find ./ -name '*aic*.o' // 중간에 aic 파일 검색


2.2 FILE의 시간기준 검색 

시간은 모두 과거의 기준으로 검색을 하기에 +- 모두 과거시간들과 검색한다.
다만 차이가 있다면 아래와 같이 n 에따라 -:less than or +:great than or 일치 있을 뿐이다.

$ find . -mtime -7             // 수정날짜 (n < 7   ) 현재 FILE(0) ~ 7일전 FILE 검색  
$ find . -mmin  30             // 수정시간 ( n         ) 오직 30분전 변경된 FILE 만 검색 
$ find . -mmin  -30            // 수정시간 ( n < 30 ) 현재 FILE(0) ~ 30분전 FILE 검색  
$ find . -mmin  +30            // 수정시간 ( n > 30 ) 30분전 FILE  ~ 이전전부 FILE 검색       
$ find . -mmin +30 -mmin -60   // 수정시간 (30 >n , n < 60) 30분전 ~ 60분전 사이만 검색 (AND연산) 

$ find . -atime n/-n/+n        // 액세스 날짜 (파일오픈) 
$ find . -amin n/-n/+n         // 액세스 시간 

$ find . -ctime n/-n/+n        // 파일속성변경 날짜 (파일오픈 및 사용) 
$ find . -cmin n/-n/+n         // 파일속성변경 시간 


2.3 FILE의 크기기준검색
    FILE의 시간과 동일하게 적용하면됨

    $ find ./ -size  +50k
    $ find ./ -size  +50k -printf "%p            %s\n"    // printf format을 만들어 사용 자세한 내용은 man참고 
    $ find ./ -size  +50k | xargs du -hs
    $ find ./ -size  +50k | xargs du -h
    


    2.4 연산의 AND/OR/NOT 검색

    $ find ./ -name 'snd-*.o' -o -name 'snd*.h'   // NAME 연산 NAME 연산  OR연산 적용 
    $ find ./ -name 'snd-soc*.o' -a -name 'snd*.o'   // NAME 연산 NAME 연산 AND 연산적용  
    $ find ./sound/  -name '*.o' -not -name 'built-in.o' //NAME 연산 NAME 연산 NOT 연산적용  ( *.o 검색 하고, -not으로 제외) 
    $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
    $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색
    

    • 수정시간 과 파일이름 검색이용 예제

    $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
    $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색 

    • 수정시간 현재부터 30일 이전까지 관련 내용 검색  ( 30 < n )

    $ find . -mtime -30 -name '*.c' -o -name '*.h' // 검색내용 중  *.c 혹은 *.h 검색 
    $ find . -mtime -30 -name '*.h'                // 검색내용 중  *.h 만 재검색

    • 30이전 부터 60이전까지 관련내용 검색 (  30 > n  &&  60  < n )

    $ find . -mtime +30 -mtime -60  -name '*.c' -o -name '*.h'
    $ find . -mtime +30 -mtime -60  -name '*.h' 


    • find를 이용한 내부 command 이용 

     아래 내용은 날짜별로 관련내용을 분류할때 사용. (mv를 실행)
           - '{}' ';'     find 내부 command

    $ find . -name "*.VER" -mtime -31 -exec mv '{}' /opt/html/31';' -print
    $ find . -name "*.VER" -mtime +31 -mtime -62 -exec mv '{}' /opt/html/62 ';' -print


      http://www.linux-faqs.info/general/difference-between-mtime-ctime-and-atime