리눅스 find 명령어 핵심 정리

리눅스 find 명령어를 사용하는 방법을 알려줍니다. find 명령어의 경로, 옵션, 표현식에서 사용할 수 있는 다양한 값에 대해서 알려주며, 실제 사용하는 실용 find 명령어 사용 예들도 다양하게 소개합니다.

리눅스의 find 명령어는 파일 시스템에서 특정 파일이나 디렉토리를 찾기 위한 명령어입니다. 다양한 옵션과 표현식을 사용하여 원하는 조건에 맞는 파일을 검색할 수 있습니다.

명령어 기본 구조는 다음과 같습니다.

find [경로] [옵션] [표현식]
  • 경로: 검색을 시작하는 경로.
  • 옵션: 명령어의 동작을 제어하는 옵션.
  • 표현식: 파일을 검색할 조건.

옵션을 find 명령어의 동작을 제어하는 역할을 하고, 표현식은 찾을 대상을 필터링하는 역할을 합니다.

find 명령어에는 여러 옵션과 다양한 표현식이 존재하며, 검색 결과는 지정된 표현식의 결합에 따라 달라지므로 표현식을 잘 알고 사용하는 것이 중요합니다.

경로, 옵션 없이 "find" 명령어만 입력하면 현재 경로와 하위 경로의 모든 파일이 출력됩니다. 옵션과 표현식은 필수로 사용해야 합니다.

경로, 옵션, 표현식을 하나씩 알아보겠습니다.

경로

경로는 find 명령어의 인자값으로 지정된 디렉토리 경로입니다. 절대 경로나 상대 경로를 모두 사용할 수 있습니다. 참고로 경로를 생략하면 현재 디렉토리 (.)를 검색 경로로 간주합니다.

옵션

옵션 항목들은 크게 심볼릭 링크와 디버그 옵션 두 가지로 나누어집니다.

심볼릭 링크와 관련된 옵션

  • -P: 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체의 정보를 사용합니다.
  • -L: 심볼릭 링크에 연결된 파일의 정보를 사용합니다.
  • -H: 심볼릭 링크를 따라가지 않지만, 명령 줄 인수에서 처리할 때는 예외를 둡니다.

디버그 옵션

  • -D [옵션]: 디버그 메시지를 출력합니다. 추가로 사용 가능한 옵션이 있으며, 디버그 메시지를 출력하는 방식을 결정합니다. help, exec, opt, rates, tree, search, stat 등이 있습니다.

표현식

find 명령어에서 사용되는 사용 옵션 중 종류가 가장 많습니다. 표현식(expressions)은 검색 대상을 정의하며, 일반적으로 다음과 같은 표현식들이 사용됩니다.

매우 많지만 -name, -type, -empty, -exec, -ls, -size 6개를 주로 사용하므로 이 표현식에 대해서는 특별히 잘 알아두는 것이 좋습니다.

  • -name: 주어진 이름의 파일이나 디렉토리를 찾음
  • -user: 지정한 사용자의 파일이나 디렉토리를 찾음
  • -group: 지정한 그룹 소유의 파일이나 디렉토리를 찾음
  • -uid: 지정한 UID를 소유한 파일이나 디렉토리를 찾음
  • -gid: 지정한 GID를 소유한 파일이나 디렉토리를 찾음
  • -perm: 지정한 허가권 값을 갖는 파일이나 디렉토리를 찾음
  • -type: 지정한 유형의 파일을 찾음(d: 디렉터리, f: 일반 파일 등)
  • -atime, -ctime, -mtime: 접근, 수정, 변경 시간 기준으로 파일을 찾음
  • -empty: 빈 파일이나 빈 디렉토리를 찾음
  • -exec: 찾은 파일에 특정 명령을 실행
  • -ls: ls -l 명령과 같은 역할
  • -size: 지정된 크기의 파일을 찾음
  • -inum: 지정된 노드번호를 가진 파일을 찾음
  • -iname: 대소문자 구별 없이 이름으로 파일을 찾음
  • -maxdepth, -mindepth: 검색 범위를 제한
  • -prune: 특정 디렉토리를 검색에서 제외
  • -newer, -cnewer: 최근에 변경된 파일을 찾음
  • -print: 결과를 파일의 절대경로로 표시
  • -print0: 검색 결과를 한 줄로 표시

또한, 표현식 연산자를 사용하여 여러 표현식을 조합할 수 있으며, AND(-a, -and), OR(-o, -or), NOT(!, -not) 연산자를 사용하여 조합할 수 있습니다. 두 개 이상의 표현식을 사용할 때는 반드시 연산자를 명시해야 합니다.

연산자를 생략하고 두 개 이상의 표현식을 조합하면 "-and"가 기본 적용됩니다.

실용 find 명령어

파일명으로 찾기 (-name)

# 현재 디렉토리에서 "example"이 포함된 파일 찾기
find . -name "*example*"

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

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

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

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

파일 타입으로 찾기 (-type)

d, f 중 한가지로 찾는 대상이 디렉토리(d), 또는 파일(f)임을 명시합니다.

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

# 현재 디렉토리에서 "example"이 포함된 디렉토리 찾기
find . -name "*example*" -type d

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

파일 크기로 찾기 (-empty, -size)

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

# 현재 디렉토리에서 "example"이 포함된 빈 디렉토리나 크기가 0인 파일을 검색하여 삭제
find . -name "*example*" -empty -delete

# 현재 디렉토리에서 2048바이트인 파일 검색
find . -size 2048c

# 현재 디렉토리에서 2048바이트보다 큰 파일 검색
find . -size +2048c

# 현재 디렉토리에서 2048바이트보다 작은 파일 검색
find . -size -2048c

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

바이트 단위는 파일 크기 표시 끝에 "c"를 붙이고, 킬로 바이트는 "k"를 붙입니다.

검색된 파일에서 추가 명령 실행하기 (-exec)

# 현재 디렉토리에서 확장자가 "log"인 파일을 찾아서 상세 정보 출력
find . -name "*.log" -exec ls -l {} \;

# 현재 디렉토리에 있는 파일 내용에 "mysql" 문자열이 포함된 파일 찾기
find . -type f -exec grep "mysql" {} \;

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

표현식으로 삭제 명령을 사용할 때는 주의해야 합니다. 잘못 사용하면 대량의 파일이 삭제되는 사고가 발생할 수 있습니다.