맨위로가기

Find (유닉스)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

`find`는 유닉스 계열 운영체제에서 파일을 검색하는 데 사용되는 명령어이다. 딕 하이트에 의해 개발되었으며, 파일 이름, 유형, 크기, 수정 날짜 등 다양한 기준으로 파일을 찾을 수 있다. `find`는 경로, 검색 조건, 그리고 검색 결과를 처리하는 동작(예: 파일 출력, 명령어 실행)을 지정하는 표현식으로 구성된다. GNU Find Utilities는 `find`의 널리 사용되는 구현체이며, 정규 표현식을 사용한 검색과 같은 추가 기능을 제공한다.

더 읽어볼만한 페이지

  • 정보 검색 시스템 - 역방향 DNS 조회
    역방향 DNS 조는 IP 주소를 도메인 이름으로 변환하는 DNS 기능으로, PTR 레코드를 사용하며, 네트워크 문제 해결, 스팸 방지, 시스템 로깅 등에 활용된다.
  • 표준 유닉스 프로그램 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 표준 유닉스 프로그램 - Rm (유닉스)
    유닉스 명령어 `rm`은 파일을 삭제하는 데 사용되며, 옵션을 통해 삭제 동작을 제어하고 디렉터리를 재귀적으로 삭제할 수 있지만, 잘못 사용하면 시스템에 심각한 손상을 초래할 수 있어 주의가 필요하며 안전 장치나 휴지통 기능 등의 대안이 존재한다.
  • 유닉스 SUS2008 유틸리티 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 유닉스 SUS2008 유틸리티 - 로케일
    로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.
Find (유닉스) - [IT 관련 정보]에 관한 문서
설명
유형명령 줄 유틸리티
개발자벨 연구소
일반 정보
운영체제유닉스
유닉스 계열
Plan 9
IBM i
플랫폼크로스 플랫폼

2. 역사

find 명령어는 1971년 버전 5 유닉스의 프로그래머 작업대 프로젝트의 일부로, cpio와 함께 딕 하이트(Dick Haight)에 의해 작성되었다.[11][12] 이는 함께 사용하도록 설계되었다.[2][3]

GNU find 구현은 원래 에릭 데커(Eric Decker)에 의해 작성되었다. 이후 데이비드 맥켄지(David MacKenzie), 제이 플렛(Jay Plett), 팀 우드(Tim Wood)에 의해 개선되었다.[4]

find 명령어는 IBM i 운영 체제로도 포팅되었다.[5]

3. Find 문법

find 명령어의 기본 문법은 다음과 같다:[6]

```console

$ find [-H] [-L] [-P] 경로... [식]

```

`-H`, `-L`, `-P` 옵션은 `find` 명령어가 심볼릭 링크를 처리하는 방식을 제어한다.[6] 기본 동작은 심볼릭 링크를 따라가지 않는 것이며, `-P` 플래그를 사용하여 명시적으로 지정할 수 있다. `-L` 플래그는 `find` 명령어가 심볼릭 링크를 따라가도록 하며, `-H` 플래그는 명령 줄 변수를 처리하는 동안에만 심볼릭 링크를 따라가도록 한다. 이러한 플래그들은 일부 오래된 버전의 `find`에서는 사용이 불가능할 수 있다.

식(expression)은 검색 조건을 지정하며, 연산자, 술어(predicate) 등으로 구성된다. 적어도 하나의 경로는 식이 우선해야 한다. `find`는 내부적으로 와일드카드를 해석할 수 있으며 명령어들은 셸 글로빙을 통제하기 위해 조심스럽게 구성되어야 한다.[6]

식 요소들은 공백으로 구분되며 왼쪽에서 오른쪽으로 평가한다. 이들은 AND (‑and 또는 ‑a) 또는 OR (‑or 또는 ‑o) 등의 논리 요소들을 포함할 수 있다.[6]

GNU `find`에는 POSIX에서 규정되지 않은 수많은 추가 기능들이 포함되어 있다.[6]

표현식은 명령줄 인수 경계에 의해 구분되며, 일반적으로 셸 구문에서 공백으로 표현된다. 표현식은 왼쪽에서 오른쪽으로 평가된다. AND (또는) 및 OR (또는)과 같은 논리적 요소뿐만 아니라 술어 (필터 및 작업)를 포함할 수 있다.[6]

자주 사용되는 주요 필터는 다음과 같다:


  • `-name ''패턴''영어`: 파일 이름이 주어진 셸 와일드카드 패턴과 일치하는지 검사한다.
  • `-type ''유형''영어`: 파일이 주어진 유형인지 검사한다. 유닉스 파일 유형은 다음과 같다.
  • `b`: 블록 장치 (버퍼링)
  • `c`: 문자 장치 (언버퍼링)
  • `d`: 디렉토리
  • `f`: 일반 파일
  • `l`: 심볼릭 링크
  • `p`: 이름 지정된 파이프
  • `s`: 소켓
  • `D`: door
  • `-print영어`: 항상 참을 반환한다. 현재 파일의 이름과 줄 바꿈 문자를 표준 출력에 출력한다.
  • `-print0영어`: 항상 참을 반환한다. 현재 파일의 이름과 널 문자를 표준 출력에 출력한다. POSIX에서 요구하지 않는다.
  • `-exec ''프로그램'' ''[인수...]'' ;영어`: 주어진 인수를 사용하여 ''프로그램''을 실행하고, 종료 상태가 0이면 참, 그렇지 않으면 거짓을 반환한다. ''프로그램'' 또는 인수가 '''{}'''이면 현재 경로로 대체된다 (''프로그램''이 '''{}'''이면 `find`는 현재 경로를 실행 파일로 실행하려고 시도한다). POSIX는 여러 '''{}'''가 지정된 경우 어떻게 해야 하는지 명시하지 않는다. 대부분의 구현은 모든 '''{}'''를 현재 경로로 대체하지만 이는 표준 동작이 아니다.
  • ``: 항상 참을 반환한다. 주어진 인수를 사용하여 ''프로그램''을 실행한 다음 가능한 한 많은 경로를 추가한다 (최대 명령줄 크기를 초과하면 xargs와 같이 여러 명령이 실행된다).[6]
  • `-ok ''프로그램'' ''[인수...]'' ;영어`: 모든 경로에 대해 사용자에게 확인을 요청한다. 사용자가 확인하면 (일반적으로 ''y'' 또는 ''yes''를 입력하여) `-exec ''프로그램 [인수...]'' ;`와 같이 동작하고, 그렇지 않으면 현재 경로에 대해 명령이 실행되지 않고 거짓이 반환한다.
  • `-maxdepth영어`: 검색할 디렉토리 깊이를 제한하는 데 사용할 수 있다. 예를 들어 `-maxdepth 1`은 현재 디렉토리로 검색을 제한한다.


표현식에서 `-print0`, `-print`, `-exec` 또는 `-ok` 중 아무것도 사용하지 않으면 find는 조건이 참으로 평가되면 기본적으로 `-print`를 수행한다.

연산자를 사용하여 find 명령의 표현식을 향상시킬 수 있다. 연산자는 우선순위가 높은 순서대로 나열된다.

  • `( expr )`: 우선 순위를 강제 지정한다.
  • `! expr`: expr이 거짓이면 참이다.
  • `expr1 expr2` (또는 `expr1 -a expr2`): AND. expr1이 거짓이면 expr2는 평가되지 않는다.
  • `expr1 -o expr2`: OR. expr1이 참이면 expr2는 평가되지 않는다.


```console

$ find . -name 'fileA_*' -o -name 'fileB_*'

```

이 명령은 현재 작업 디렉토리 트리에서 이름이 `fileA_` 또는 `fileB_`로 시작하는 파일을 검색한다. 셸이 확장하지 않도록 `fileA_*`를 따옴표로 묶는다.

```console

$ find . -name 'foo.cpp' '!' -path '.svn'

```

이 명령은 이름이 "foo.cpp"인 파일을 찾기 위해 하위 디렉토리 트리 ".svn"을 제외한 현재 작업 디렉토리 트리를 검색한다. 셸이 기록 대체 문자로 해석하지 않도록 `!`를 따옴표로 묶는다.

4. 정규 표현식 (GNU find)

GNU `find`에는 POSIX에서 규정되지 않은 수많은 추가 기능들이 포함되어 있다.[1] `find`는 `-regex`나 `-iregex` 등을 사용하여 정규 표현식으로 파일 경로 이름을 매칭할 수 있는데, GNU 프로젝트 버전의 `find`는 여러 정규 표현식 문법을 지원한다.[1] 따라서 GNU `find`는 기본적으로 정규 표현식을 GNU Emacs의 정규 표현식으로 해석하며, 다른 문법에 대해서는 명령줄 옵션 `-regextype`의 인수를 사용하여 해석 방식을 전환하여 대응한다.[1]

5. 예제

find 명령어와 관련된 다양한 사용 예시는 다음과 같다.


  • 현재 디렉터리에서 이름이 'my'로 시작하는 파일 검색:

```console

$ find . -name 'my*'

```

이 명령어는 현재 작업 디렉터리 트리에서 이름이 "my"로 시작하는 파일을 검색한다. 작은따옴표는 셸 확장을 방지한다. 따옴표가 없으면 셸은 ''my*''를 현재 작업 디렉터리에서 이름이 "my"로 시작하는 파일 목록으로 대체한다.[6] 프로그램의 최신 버전에서는 디렉터리를 생략할 수 있으며, 이는 현재 작업 디렉터리를 의미한다.

  • 일반 파일만 검색:

```console

$ find . -name 'my*' -type f

```

이 예제에서는 위의 예제에서 검색 결과에서 일반 파일만 추출한다. 따라서 디렉터리, 특수 파일, 파이프 또는 심볼릭 링크 등은 제외된다. 쉘 패턴에서 ''*'' 앞에 백슬래시를 사용하는 것은 이전 예제와 동일한 이유를 피하는 또 다른 방법이다. 또한, 식은 왼쪽부터 처리되므로 일반 파일만 추출한 후 검색하려면 식의 순서를 재정렬하여 "-type f -name my\*"로 한다. 결과는 같다.

  • 확장된 파일 정보 출력:

```console

$ find . -name 'my*' -type f -ls

```

이것은 확장된 파일 정보를 출력한다.[6]

  • 모든 디렉터리에서 'myfile'이라는 이름의 일반 파일 검색:

```console

$ find / -name myfile -type f -print

```

이 명령은 모든 디렉터리를 검색하여 이름이 ''myfile''인 일반 파일을 찾아 화면에 출력한다. 이러한 방식으로 파일을 찾는 것은 일반적으로 좋은 방법이 아니다. 이는 상당한 시간이 소요될 수 있으므로, 디렉터리를 더 구체적으로 지정하는 것이 좋다.[6]

  • 특정 디렉터리 트리 제외:

```console

$ find / -path 제외할_경로 -prune -o -type f -name 내_파일 -print

```

이 명령어는 ''제외할_경로''(선행 '/'를 포함한 전체 경로) 하위 디렉터리 트리를 제외한 모든 디렉터리에서 이름이 ''내_파일''인 일반 파일을 찾는다. 이때 `-prune` 액션으로 해당 하위 디렉터리 트리는 제외된다.[6]

  • 여러 디렉터리 검색:

```console

$ find local /tmp -name mydir -type d -print

```

이 명령은 현재 작업 디렉터리의 ''local'' 하위 디렉터리 트리와 ''/tmp'' 디렉터리 트리에서 ''mydir''이라는 이름을 가진 디렉터리를 검색한다.[6]

  • 오류 무시:

```console

$ find / -type f -name myfile -print 2> /dev/null

```

root가 아닌 다른 사용자로 이 작업을 수행하는 경우, 권한 거부 오류(및 기타 모든)를 무시하고 싶을 수 있다. 오류는 stderr로 출력되므로 출력을 /dev/null로 리디렉션하여 표시되지 않도록 할 수 있다.

  • 이름이 'jsp' 또는 'java'로 끝나는 파일 검색:

```console

$ find . \( -name '*jsp' -o -name '*java' \) -type f -ls

```

`-ls` 연산자는 확장된 정보를 출력하며, 예시는 이름이 'jsp' 또는 'java'로 끝나는 모든 일반 파일을 찾는다. 괄호가 필요하다. -ls 연산자는 모든 버전의 `find`에서 사용할 수 있는 것은 아니다.[6]

  • 파일 권한 변경:

```console

$ find /var/ftp/mp3 -type f -iname '*.mp3' -exec chmod 744 {} \;

```

이 예시에서는, `/var/ftp/mp3` 디렉터리에 있으며 이름이 '.mp3' 또는 '.MP3' 등으로 끝나는 모든 MP3 파일에 대해 파일 권한을 변경한다.

  • xargs와 연계:

```console

find /var/ftp/mp3 -type f -iname '*.mp3' -print0 | xargs -0 chmod 744

```

`find`를 `xargs`와 함께 사용하면 효율을 높일 수 있다.

  • 문자열 검색:

```console

$ find /tmp -type f -exec grep 'search string' /dev/null '{}' \+

```

`/tmp` 아래에 있는 모든 파일에 대해 파일 내용에 "search string"이라는 문자열이 있는지 검색한다.

  • 특정 사용자가 소유한 파일 검색:

```console

find . -user <사용자ID>

```

특정 사용자가 소유한 파일을 검색한다.

  • 대소문자 구분 없이 검색:

```console

$ find . -iname 'MyFile*'

```

`-iname`은 대소문자를 구분하지 않는 검색 식이다.

  • 크기로 파일 검색:

```console

$ find . -size +100k -a -size -500k

```

100킬로바이트에서 500킬로바이트 사이의 크기를 가진 파일을 검색한다.

  • 특정 날짜/시간 범위로 파일 검색:

```console

$ find ~/Documents/ -iname "*.txt" -newermt 2017-02-01 -not -newermt 2017-03-01

```

2017년 2월에 마지막으로 편집된 모든 텍스트 파일을 찾는다.

6. POSIX 무한 출력 방지

실제 파일 시스템은 종종 하드 링크 또는 심볼릭 링크를 사용하여 생성된 루프 구조를 포함한다. POSIX 표준은 다음과 같이 요구한다.

를 제거하고 아래의 인용문으로 대체한다.

: `find` 유틸리티는 무한 루프를 감지해야 한다. 즉, 마지막으로 발견된 파일의 상위 디렉터리인 이전에 방문한 디렉터리에 진입하는 것이다. 무한 루프를 감지하면 `find`는 표준 오류에 진단 메시지를 쓰고 계층 구조에서 위치를 복구하거나 종료해야 한다.[1]

7. 관련 유틸리티


  • locate는 미리 구축된 파일 데이터베이스를 검색하는 유닉스 검색 도구이다. `find`보다 빠르지만 데이터베이스가 최신 상태가 아닐 수 있으므로 정확도가 떨어진다.
  • grep은 정규 표현식과 일치하는 줄을 찾기 위해 일반 텍스트 데이터 세트를 검색하는 명령줄 유틸리티이며, 기본적으로 표준 출력에서 일치하는 줄을 보고한다.
  • tree는 디렉터리 트리에서 발견된 파일을 재귀적으로 나열하는 명령줄 유틸리티로, 파일 계층 구조에서 파일 이름의 위치에 따라 파일 이름을 들여쓴다.
  • GNU Find 유틸리티(findutils)는 `find` 및 `xargs` 도구의 구현을 포함하는 GNU 패키지이다.
  • BusyBox는 매우 제한된 리소스를 가진 임베디드 운영 체제를 위해 설계된 단일 실행 파일에서 여러 개의 축소된 유닉스 도구를 제공하는 유틸리티이다. `find`의 버전도 제공한다.
  • dir에는 파일 또는 디렉토리를 재귀적으로 검색하는 /s 옵션이 있다.
  • 벨 연구소의 Plan 9는 `find`를 대체하기 위해 두 개의 유틸리티를 사용한다. 트리를 탐색하고 이름을 인쇄하는 `walk`와 셸 스크립트 형식의 표현식을 평가하여 (grep과 같이) 필터링만 하는 `sor`이다.
  • `fd`는 Rust 프로그래밍 언어로 작성된 `find`의 간단한 대안이다.[10]

윈도우 명령 프롬프트 (MS-DOS 명령어)의 find는 유닉스 명령어의 fgrep과 유사하게 문자열 검색을 수행한다.

참조

[1] 웹사이트 find(1) – Linux manual page http://man7.org/linu[...] 2019-11-19
[2] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[3] 웹사이트 libarchive/libarchive https://github.com/l[...] 2015-10-04
[4] 문서 Finding Files https://www.gnu.org/[...]
[5] 웹사이트 IBM System i Version 7.2 Programming Qshell https://www.ibm.com/[...] 2020-09-05
[6] 문서 find files
[7] 문서 find
[8] 문서 find
[9] 웹사이트 google / walk: Plan 9 style utilities to replace find(1) https://github.com/g[...] 2020-03-30
[10] 웹사이트 sharkdp/fd: A simple, fast and user-friendly alternative to 'find' https://github.com/s[...] 2020-03-30
[11] 기술보고서 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[12] 웹인용 libarchive/libarchive https://github.com/l[...] 2015-10-04



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com