Linux - find 명령어

find 명령어의 기본적인 사용법을 소개합니다.

  • 탐색
  • 삭제

탐색

우선 다음과 같은 파일과 폴더들이 있다고 가정합니다.

$ tree
.
├── test1
│   └── 123.log
├── test1.txt
├── test2
│   └── 111.log
├── test2.txt
├── test3
│   └── 333.log
└── test3.txt

find를 이용하여 간단한 파일을 찾을 때는 다음과 같은 명령어를 사용합니다. 여기서 starting point는 탐색할 폴더의 경로입니다.

$ find [starting-point...] -name "file name"

예를 들어 다음과 같이 탐색 경로를 .로 설정하면 현재 경로에 있는 모든 파일들을 탐색합니다.

$ find . -name "*.log"
./test2/111.log
./test1/123.log
./test3/333.log

만약 다음과 같이 탐색 경로를 생략하면 현재 경로를 기준으로 탐색을 합니다.

$ find -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

다음과 같이 1개 이상의 탐색 경로를 입력할 수 있습니다. 즉, 아래 명령어는 /user, /home, /tmp 경로에서 jar 파일을 찾습니다.

$ find /user /home /tmp -name "*.jar"
/home/js/apps/idea-IC-203.5981.155/lib/jshell-frontend.jar
/home/js/sources/openjdk-jdk8u/jdk/test/tools/launcher/UnicodeTest.jar
....

Case Insensitive

find 명령어는 기본적으로 대소문자를 구분하여 탐색합니다.

따라서 다음과 같이 txtTXT에 대한 탐색 결과가 달라질 수 있습니다.

$ find -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.TXT"

만약 대소문자를 구분하지 않고 찾고 싶다면 -iname 옵션을 사용하면 됩니다.

$ find -iname "*.TXT"
./test2.txt
./test1.txt
./test3.txt

max depth와 min depth

탐색 경로를 설정하면, 그 경로 아래에 있는 모든 파일을 탐색합니다. 디렉토리의 깊이(depth)를 설정하여, 그 이하 또는 그 이상의 파일들은 찾고 싶지 않을 때가 있습니다. 이럴 때는 -maxdepth-mindepth 옵션을 사용하여 범위를 지정해줄 수 있습니다.

다음과 같은 구조의 디렉토리가 있다고 가정합니다.

$ tree
.
├── test1
│   ├── 123.log
│   └── test4
│       ├── 4555.log
│       └── test5
│           └── 666.log
├── test1.txt
├── test2
│   └── 111.log
├── test2.txt
├── test3
│   └── 333.log
└── test3.txt

maxdepth

다음과 같이 최대 depth를 2로 설정하면, depth가 2 이하인 파일들을 대상으로 탐색합니다. (depth 0은 현재 경로를 의미합니다.)

$ find . -maxdepth 2 -name "*.log"
./test2/111.log
./test1/123.log
./test3/333.log

mindepth

다음과 같이 최소 depth를 3으로 설정하면, depth가 3 이상인 파일들을 대상으로 탐색합니다.

$ find . -mindepth 3 -name "*.log"
./test1/test4/4555.log
./test1/test4/test5/666.log

에러 로그 출력하지 않기

폴더가 존재하지 않거나 권한이 없을 때 다음과 같이 에러 로그가 출력됩니다. 에러 로그가 매우 많이 출력되서 탐색 결과를 보는 것을 어렵게 만들 때가 있습니다.

$ find /user /tmp -name "*.jar"
find: ‘/user’: No such file or directory
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-upower.service-ts25lg’: Permission denied
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-switcheroo-control.service-tftxRh’: Permission denied
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-systemd-resolved.service-QzA0Bf’: Permission denied

이럴 때는 다음과 같이 2> /dev/null으로 에러 로그는 터미널에 출력되지 않도록 만들 수 있습니다.

$ find /user /tmp -name "*.jar" 2> /dev/null

특정 형식의 파일만 찾기

특정 이름의 디렉토리를 찾거나, 특정 이름의 파일을 찾고 싶을 때가 있습니다.

이럴 때는 -type 명령어를 사용하면 됩니다. 다음과 같은 옵션을 추가하면 됩니다.

  • -type d : Directory를 대상으로 탐색을 수행합니다.
  • -type f : 일반적인 File을 대상으로 탐색을 수행합니다.

위의 옵션을 사용하여 탐색하면 다음과 같은 결과가 출력됩니다.

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -type d -name "test*"
./test2
./test1
./test3

$ find . -type f -name "test*"
./test2.txt
./test1.txt
./test3.txt

type에 대한 더 많은 옵션은 find의 man page를 참고하시면 됩니다.

-type c
       File is of type c:
       b      block (buffered) special
       c      character (unbuffered) special
       d      directory
       p      named pipe (FIFO)
       f      regular file
       l      symbolic  link;
       s      socket
       D      door (Solaris)

삭제

find로 원하는 파일을 찾고 그 파일을 삭제하고 싶을 때가 있습니다.

find 명령어 마지막에 -delete 옵션을 추가하면 검색된 파일들이 삭제됩니다.

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.txt" -delete

$ ls
test1  test2  test3

-exec를 이용하여 삭제

-exec 옵션은 검색된 파일에 exec를 적용하여 어떤 명령어를 수행하는 옵션입니다.

-exec rm {} \;를 입력하면 탐색된 파일에 대해서 삭제를 하도록 만들 수 있습니다. (단순히 파일을 삭제하는 것이라면 -delete 옵션이 더 간단합니다.)

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.txt" -exec rm {} \;

$ ls
test1  test2  test3
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha