본문 바로가기
반응형
Programming/Linux

[Linux/shell] find 명령어 정리

by JAMINS 2020. 5. 26.

Linux 기반의 시스템에서 사용할 수 있는 커맨드 중 하나로 특정 Directory에서 원하는 파일을 찾을 수 있는 기능이다. 파일 단위로 뭔가를 다루기 위해서는 반드시 알아야 하는 커맨드 중 하나이다. 다양한 옵션을 제공하기 때문에 잘 활용하면 원하는 파일들의 목록을 가져올 뿐만 아니라 찾은 파일들로 추가로 작업 할 수도 있다. 기본적인 사용법부터 알아가보자. 커맨드의 사용법을 알기 위해서는 find --helpman find 를 통해 사용법을 알 수 있다.

$ man find
NAME
       find - search for files in a directory hierarchy

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

DESCRIPTION
       This  manual  page documents the GNU version of find.  GNU find searches the directory tree rooted at each given file
       name by evaluating the given expression from left to right, according to the rules of precedence (see section  OPERA-
       TORS),  until the outcome is known (the left hand side is false for and operations, true for or), at which point find
       moves on to the next file name.

       If you are using find in an environment where security is important (for example if you are using it to search direc-
       tories that are writable by other users), you should read the "Security Considerations" chapter of the findutils doc-
       umentation, which is called Finding Files and comes with findutils.   That document also includes a lot  more  detail
       and discussion than this manual page, so you may find it a more useful source of information.
       .........

정의 그대로 find는 계층구조로 이루어진 디렉토리 내에 존재하는 파일들을 검색 하는 기능이다. Synopsis 와 같은 형태로 커맨드를 수행할 수 있다. 다양한 옵션을 예시와 함께 알아가보겠다.

Option

Synopsis의 expression 영역을 구성하는 요소이다. 즉 find [path] (expression) 이러한 형태에서 path 지정 이후로 작성한다. 찾아야할 파일을 필터링하는 중요한 부분이다. 이 옵션들은 중첩이 가능하여 원하는 파일을 정교하게 찾아낼 수 있다. 하나씩 살펴보자.

-type

가장 기본적으로 지정할 수 있는 옵션. 특정 디렉토리 내의 특정 타입에 해당하는 파일들을 찾는다.

-type c 와 같은 형태. c 에는 아래 타입중 하나를 명시할 수 있다.

  • f : 일반적인 파일
  • l : 심볼링 링크
  • d : 디렉토리

가장 많이 사용되는 타입들의 목록이다.

예시

$ find . -type f
$ find ~/data -type d
$ find ../ -type l

# type을 중첩해서 쓰지는 못함 (x)
$ find . -type f -type l

-name

type 과 마찬가지로 자주 사용하면서도 기본적인 옵션이다. 말 그대로 파일명으로 검색하는 기능이다. ls 명령에서 사용하는 것과 같이 *, ?, [], . 이러한 패턴을 그대로 사용할 수 있다.

  • . : 현재 Path를 시작지점으로 지정
  • [] : 파일명으로 올 수 있는 문자의 종류 및 순서, 범위를 지정 (정규식과 유사)
  • ? : 한 글자를 의미, 어떠한 문자도 올 수 있음

예시

# image.img 파일을 찾을 때
$ find . -name image.img

# m1.jpg, m2.jpg 와 같이 "m + 한글자 숫자" 를 찾을 때
$ find . -name 'm?.jpg'

# json 파일 전부 찾고 싶을 떄
$ find . -name *.json

# 디렉토리중 te 로 시작하는 목록
$ find . -type d -name '[t][e]*'

-maxdepth, -mindepth, -depth

  • maxdepth : 특정 디렉토리에서부터 내려갈 수 있는 Level의 최대값 설정
    • -maxdepth 0 : empty
  • mindepth : 파일들의 계층 depth의 최소값 설정
    • -mindepth 1 : 모든 파일
  • depth : 특정 depth에 해당하는 파일들의 목록

특정 디렉토리의 계층구조의 Level을 수치로 필터링할 수 있다. 이 둘은 중첩이 가능하여 계층 범위를 scan 할 수 있다. 디렉토리의 구조가 아래와 같다고 가정하자.

.
├── avi
│   ├── dance
│   │   ├── 20200308.mov
│   │   ├── 20200310.mov
│   │   ├── 20200317.mov
│   └── workout
│       ├── home_training
│       │   ├── 20200415.mov
│       │   ├── 20200421.mov
│       └── running
│           └── 20200421_225927.mp4
├── mov_1.mp4
└── sound
    └── bgm
        ├── Nimbus.mp3
        └── Unstoppable.mp3

현재 디렉토리에는 mov_1.mp4 파일과 2개의 디렉토리로 구성되어있다. mp4 파일의 level은 1이므로, -mindepth 2 로 지정하게되면 이 파일(mov_1.mp4)이 제외된 나머지 파일(디렉토리 포함) 들이 검색된다.

$ find . -mindepth 2                                # level이 2 이상인 모든 파일, 디렉토리 목록
$ find . -maxdepth 2                                # depth가 최대 2인 모든 파일, 디록토리 목록
$ find . -mindepth 2 -maxdepth 3        # depth 2~3인 모든 파일, 디렉토리 목록
$ find . -depth 2                                        # 2 depth에 해당하는 모든 파일, 디렉토리 목록

예시

$ find . -type f -mindepth 2 -maxdepth 2
$ find . -type d -mindepth 4
$ find . -type f -depth 3

-size

-size n[cwbkMG] 의 형태로 사용 가능하며 파일 사이즈로 찾을 수 있다. suffix들은 파일 사이즈의 단위를 명시할 수 있다.

  • c : byte
  • w : 2 byte word
  • k : Kilobytes
  • M : Megabytes
  • G : Gigabytes

기본적으로 -size 1M 와 같이 붙이면 정확하게 1Mb인 파일들을 검색할 수도 있고 +,- 를 붙여 범위 지정도 가능하다. 범위 지정시 각 boundary는 포함되지 않는다.

예시

# 10Mb 인 파일 검색
$ find . -type f -size 10M

# 2G~5G 사이인 avi 파일 검색
$ find . -type f -size +2G -size -5G

-newer

-newer file 의 형태로 사용하며, 명시된 파일의 last modifed 시점 보다 최신의 파일들을 검색한다. 옵션명 자체가 직관적이여서 바로 의미를 알 수 있다. Symbolic Link의 경우는 -H, -L 옵션을 적용하면 보여진다.

# 20200310.mov 파일 이후에 생성된 파일을 검색
$ find . -type f -newer ./avi/dance/20200310.mov

-atime, -ctime, -mtime

  • atime : access time
  • ctime : creation time
  • mtime : modification time

-atime n 형태로 사용. 파일의 last access time으로 검색하는 옵션이다. n의 의미는 기본적으로 n day (24 x n) 을 의미하며 추가로 Suffix를 붙여서 정확한 시간을 지정할 수 있다.

Suffix

  • s : second
  • m : minute
  • h : hour
  • d : day
  • w : week

e.g. find . -atime -1h30m

숫자 앞에 +, - 를 표시하여 범위를 지정할 수 있는데 +는 n일 포함하여 더 오래된 파일, -는 현 시점부터 n일 전 까지, 아무 표시 없다면 정확히 n일 전에 access/create/modified 된 파일을 의미한다.

예시

# 3일 동안 access되지 않은 파일 찾기
$ find . -type f -atime +4

# 일주일 내에 생성된 파일 찾기
$ find . -type f -ctime -7
$ find . -type f -ctime -1w

자주 사용되는 기본적인 옵션들만 정리하였다. 이 밖에도 regex, newerXY, path, group 등등 옵션들이 더 있으나 다음 기회에 이어서 정리하도록 하겠다.

댓글