ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] find 명령어에 대해 알아보자
    IT Study/OS 2026. 1. 26. 11:25

    Linux 서버 환경에서 정말 많이 쓰이는 명령어를 꼽아보라하면 단연 find가 있을 것이다. 

    find 

    지정한 디렉토리와 그 하위 모든 디렉토리를 뒤져서 조건(expression)에 맞는 파일을 찾는다. 

     

    find pattern [file-list]

    Linux에서는 아무런 조건(출력 지시)을 주지 않으면 -print가 생략된 것으로 간주하고 결과를 보여준다. 그러나 예전 시스템, 전통적인 유닉스(UNIX)에서는 -print 없으면 결과값 출력을 하지 않고 조용히 실행됨 ! 

     

     

    Criteria 주요 검색 조건 

    조건명 의미 상세 설명
    -name filename  이름으로 찾기  파일 이름이 일치하면 선택 (와일드 카드 * 사용 시 따옴표 필요) 
    -type c  종류로 찾기  f(일반 파일), d(디렉토리) 등 파일 종류졀로 찾기
    -user name  소유자로 찾기  특정 사용자(ID 또는 이름)가 소유한 파일 찾기
    -size ± n  크기로 찾기 +n(n보다 큼), -n(n보다 작음), n(정확히 n) 바이트 크기인 파일 검색 
    -mtime ± n 수정 시간  최근 n일 내에 수정된 파일 찾기
    -newer file  비교 검색 지정한 file보다 더 최근에 수정된 파일만 찾기 
    -print 경로 출력 조건에 맞는 파일의 전체 경로 이름을 화면에 한 줄씩 표시
    -exec command 즉시 실행 찾은 파일들을 인자 삼아 사용자가 지정한 명령어를 즉시 실행
    -ok command  확인 후 실행  -exec와 동일하게 명령어를 실행하지만, 각 파일마다 실행 여부 물어보고 승인(y)받아 처리

     

    • -name filename 
      1. * (Asterisk): 0개 이상의 모든 문자와 일치 
      2. ? (Question Mark): 1개의 문자와 일치 - ?의 개수로 모르는 문자만큼을 표시할 수 있음 
      3. [ ] (Square Brackets): 괄호 안의 문자 중 하나와 일치 
        [ab]*.txt : a나 b로 시작하는 텍스트 파일 
    • -type c
    기호 의미(file type) 설명
    f Plain file 일반 텍스트, 소스 코드, 이미지, 실행 파일 등 
    d Directory 폴더(디렉토리)만 골라서 찾고 싶을 때 사용
    l Symbolic link 다른 파일을 가리키는 바로가기(링크) 파일
    s Socket 프로세스 간 통신에 쓰이는 소켓 파일 
    • -user name
      • 특정 사용자를 찾는 방법 
        1. who: 현재 로그인한 모든 사용자의 아이디부터 터미널 정보, 접속 시간까지 알려줌 
        2. w: who보다 더 자세한 정보 제공(접속 중인 사용자가 지금 어떤 명령어를 실행중인지 확인 가능) 
        3. users: 접속중인 사용자의 아이디만 제공 
        4. cat /ect/passwd: 시스템의 모든 사용자 목록 확인 

     

    • -size ± n
      • +n: 크기가 n보다 큰 파일을 찾음(초과)
      •  -n: 크기가 n보다 작은 파일을 찾음(미만) 
      • n(기호 없음): 크기가 정확히 n인 파일을 찾음 
        K 킬로바이트(1024bytes) M 메가바이트
        G 기가바이트    
        c 바이트(Caracters/Bytes)  b 512바이트 블록(단위 쓰지 않는 경우 기본적으로 이 단위 사용) 
    • -mtime ± n
      • +n: 수정된 지 n일보다 오래된 파일 찾기
      • -n: 수정된 지 n일이 안된(최근 n일 이내) 파일을 찾기 
      • n: 정확히 n일 전에 수정된 파일을 찾기 
      • mtime외에 두가지 시간 기준 
        • -atime(Access Time): 파일을 읽거나 실행한 시간 기준 
        • -ctime(Change Time): 파일의 권한이나 소유주 등 속성이 바뀐 시간 기준 

     

    • - newer file 
      • 상대적 시간 비교: 날짜나 시간을 숫자로 계산하는 대신 특정 파일보다 더 나중에(최근에) 수정된 파일을 찾는다. 

     

    • - exec [command]
    기호 의미 설명
    { } Place holder find가 찾아낸 파일의 이름이 들어갈 빈칸
    Escape Character  Shell에 의해 해석되지 않고 명령어에게 그대로 전달되도록 보호 
    ; Delimiter -exec 뒤에 붙은 명령어의 끝을 알리는 마침표 
    > &  Redirection  결과와 에러 메시지 한꺼번에 처리할 때 사용 
    >>&   기존 파일 내용 뒤에 출력과 에러를 추가함 

     


    Actions 찾은 후 수행할 작업 

    파일을 찾은 뒤 무엇을 할지 결정한다. 
    • -print: 찾은 파일의 전체 경로를 화면에 출력 
    • -exec command {} \; : 찾은 파일들을 대상으로 특정 command를 즉시 실행, {}는 찾은 파일 이름 의미, 끝에 \;를 꼭 붙여야함 
    • -ok command {} \; : -exec와 같지만  실행하기 전에 "정말 실행할까?"라고 사용자에게 일일이 물어보는 것 

     

    AND OR NOT 복합 조건 

    • AND (공백): 조건1 조건2 처럼 공백으로 띄우면 두 조건을 모두 만족해야함 
    • OR(-o): 조건1 -o 조건2는 둘 중 하나만 만족 
    • NOT (!): !조건은 해당 조건이 아닌 파일을 찾음 

    Example 실전 예제 

    find명령어는 하위 디렉토리까지 샅샅이 뒤져 조건에 맞는 파일을 찾아내는 도구이기에 '아 그 파일이 어딨더라..'할 때 자주 쓰인다. 

     

    • 이름(name)으로 찾기 
    find . -name '*.m"

    → 현재 디렉토리와 하위 폴더 내의 m확장자(매트랩) 파일 찾기 

    find . -name 'exp[1-3].dat" -print

    → 범위 지정해서 exp1.dat, exp2.dat, exp3.dat만 골라서 찾기 

    find -iname "README.txt"

    → 대소문자 구문 없이 Readme.txt, readme.txt, README.txt등을 모두 찾기 

    find . ! -name "*.o" -print

    → object file(.o)를 제외한 모든 파일을 찾기 


    • 타입(type)으로 찾기
    find . -type -f name "result*"

    → 이름이 result로 시작하는 것들 중, 폴더는 제외하고 일반 파일만 찾아준다.

    find /home/usr/research -type d -empty -delete

    → 연구 디렉토리 안에 내용물이 없는 빈 디렉토리만 골라내어 삭제 

    find . -type f -user username

      특정 사용자(username)가 소유한 일반 파일만 찾기 


    • 사용자(user)로 찾기 
    find . -user ejl -type f
    find /data -user 777

    → ejl(ID: 777)라는 사용자가 만든 파일을 찾아줌 

    더보기

    명령어 평가 순서

    find -name [name arguement] -file [file arguement] 처럼 여러 명령어가 쓰일때 어떤 순서로 실행될까 ?

     

    find는 여러 조건을 나열하면 기본적으로 AND 연산으로 묶는다. 

     

    • 작동 방식: 첫 번째 조건이 맞으면 다음 조건을 검사하고 모든 조건이 만족될 때만 해당 파일을 결과에 포함 
    • 순서의 영향: 논리적으로 순서가 바뀌어도 결과는 동일함 

    결과는 동일하지만 효율적으로 코드를 실행하기 위해 권장되는 작성 순서가 있다는데 .. 

    1. 범위 좁히기: 검색 대상을 가장 빨리 줄여줄 수 있는 조건을 먼저 씀 
    2. 비용이 적은 검사: 파일 이름 -name또는 소유자( -user)확인은 파일의 상세 정보를 다 뒤지는 것보다 빠르기에 보통 앞에 작성한다. 
    3. 수행할 작업: -print 나 -exec 같은 Action은 항상 조건들 뒤에 온다. 

    • 크기(size)로 찾기 
    find /home -size +100M -print

    → home디렉토리에서 100MB가 넘는 대용량 파일을 찾아줌(누가 누가 서버 용량을 많이 차지하나를 볼 수 있음) 

    find . -type f -size -10k

    → 매우 작은 텍스트 파일이나 설정 파일들만 골라낼 때 사용 

    find . -size +1k -size -5k

    → 특정 범위의 크기 찾기(AND조합)로 크기가 1k초과 5k미만인 파일들만 골라냄 

    find . -size 0c

    내용이 하나도 없는 빈 파일(0바이트) 파일을 찾을 때 유용 


    • 시간(mtime, atime, ctime)으로 찾기 
    find . -type f -mtime -1

    → 최근 24시간 이내에 수정한 파일 찾기(어제부터 오늘까지 작업한 코드를 한번에 확인할 때 유용)

    find /data/exp -mtime +30

    → 한 달(30일) 이상손대지 않은 데이터 찾기


    • 특정 파일 기준(newer)으로 찾기 
    find . -newer [filename] -print

    → 특정 파일을 만든 시점 이후에 생성되거나 수정된 모든 파일을 찾아줌 


    •  exec(또는 ok) 사용해보기 
    find . -type f -size +1M -exec cp {} ./backup/ \;

    →  find가 파일을 찾을때마다 cp [파일명] ./backup/ 명령을 자동으로 실행 

     

    find /data -user ejl -type -f -exec cp {} /backup \; >& error.log

    → find ... : ejl 소유의 파일을 찾아서

    → -exep cp {} /backup \; : 찾은 파일을 하나씩 /backup 폴더로 복사하고 

    → >& error.log: 복사 과정에서 발생한 모든 결과와 에러(ex. 용량 없음, 권한 없음)를 error.log에 저장해라 

     

    더보기

    일단 find명령어에서 -exec를 쓴다면 {}뒤에는 무조건 한 칸 띄우고 \;를 붙인다고 외우자 
    find 명령어에서 -exec뒤에 오는 명령어의 끝을 확실히 알리기 위해 ;를 쓰도록 정해두었고 

    쉘이 ;를 가로채지 않도록 이스케이프 구문 \를 앞에 붙여준다. 

     

    {}는 find명령어가 찾은 파일의 이름을 담는 그릇 역할을 하기 때문에 절대 빠지면 안된다 ! 

    find는 조건을 만족하는 파일을 하나씩 찾아내고 이를 -exec를 통해 파일의 이름을 실행할 명령어 (ex. rm, cp)에게 전달해주는 역할을 한다. 

     

    예를 들어, find . -name "*log" -exec rm \;라고만 쓴다면, 리눅스는 지워라!(rm)이라는 명령은 받았지만 뭘 ? 지워야할 지 모르는 상태가 된다. 결국 find의 결과를 {}가 받아주고 이를 -exec명령어에서 인자로 처리하는 것임 !! 

     


    • grep 명령어와 find 명령어 함께 사용하기 
    grep: 파일 속에서 특정 단어를 찾을 때 필수적인 도구 
    옵션 기능 설명
    -i  ignore-case 검색하려는 구문의 대소문자를 구분하지 않음 
    -v Invert Match 특정 단어가 포함되지 않은 줄만 보여줌 
    -n Line Number  찾은 내용이 파일의 몇 번째 줄에 있는지 번호를 표시
    -r  Recursive  하위 폴더의 모든 파일까지 샅샅이 뒤져서 찾음 

     

    grep -i 'error' log.txt

    → 'error'라는 단어가 들어간 모든 줄 찾기 

    grep -i 'sensor' *

    → 현재 디렉토리의 모든 파일에서 'sensor'단어 찾기 

     

    그럼 실전에서 많이 쓰이는 파이프라인을 이용하여 find명령어와 함께 사용하는 방법을 알아보자 

     

    특정 문자열을 가지고 있는 파일명을 알고 싶을 땐, grep한 결과를 find하면 된다. 

    → svpos라는 서브루틴을 사용하는 main파일이 무엇인지 알고싶어 ! 

    grep -i 'svpos' * | find -name 'sndemo*'
    
    ./sndemo15.m
    ./sndemo09.m
    ./sndemo03.m
    ./sndemo06.m
    ./sndemo17.m
    ./sndemo19.m
    ./sndemo05.m
    ./sndemo40_sw.m
    ./sndemo10.m
    ./sndemo41.m
    ./sndemo14.m
    ./sndemo39.m
    ./sndemo38.m
    ./sndemo12.m
    ./sndemo02.m
    ./sndemo08.m
    ./sndemo20.m
    grep: ./sndemo18.m
    subroutine./sndemo11.m

     

     

    반대로 파일 중, 특정한 문자열을 가진(예를 들어 사용자 명이 담긴) 파일만 골라내고 싶을 땐 find | grep을 사용하면 된다. 

    → 메인 파일 중, 10-20번 파일이 모두 있는지 알고싶어 ! 

    find -name 'sndemo*' -type f | grep -E 'sndemo(1[0-9]|20)' | sort
    ./sndemo10.m
    ./sndemo11.m
    ./sndemo12.m
    ./sndemo15.m
    ./sndemo16.m
    ./sndemo17.m
    ./sndemo18.m
    ./sndemo19.m
    ./sndemo20.m

    이러한 결과를 통해 13,14 파일이 없다는 사실을 알 수 있음 

     

     


    find와 grep은 처음에 배울 때 헷갈리지만 잘 알아두면 굉장히 강력한 명령어이다. 

    잘 익혀서 써보자 ..^___^ 

Designed by Tistory.