find 명령어 사용법: 파일 찾기의 기본기

find 명령어 사용법: 파일 찾기의 기본기

프로젝트가 커지면 파일을 찾는 것 자체가 일이 됩니다. “그 설정 파일이 어디 있었더라?”, “테스트 파일이 몇 개나 되지?”, “일주일 전에 수정한 파일이 뭐였지?” 같은 질문에 매번 파일 탐색기를 뒤지는 건 비효율적이죠.

find는 디렉토리 트리를 탐색하면서 조건에 맞는 파일을 찾아주는 명령어입니다. 이름, 타입, 크기, 수정 시간 같은 다양한 조건을 조합할 수 있고, 찾은 파일에 대해 명령어를 바로 실행할 수도 있어요. 1970년대 Unix 시절부터 있었던 아주 오래된 도구인데, 그만큼 어디서든 쓸 수 있다는 게 강점입니다.

이번 글에서는 find의 기본 사용법부터 이름/타입/크기 필터링, 논리 연산자, 검색 결과에 명령어 실행하기까지 단계별로 살펴보겠습니다.

기본 사용법

가장 기본적인 형태는 find 경로입니다. 지정한 경로 아래의 모든 파일과 디렉토리를 재귀적으로 출력합니다.

find src/utils
결과
src/utils
src/utils/korean.ts
src/utils/tags.ts
src/utils/og.ts
src/utils/posts.ts

경로를 생략하면 현재 디렉토리(.)부터 탐색합니다. find만 단독으로 실행하면 현재 디렉토리 아래의 모든 파일과 디렉토리가 쏟아져 나오니 주의하세요.

find의 기본 구조는 이렇습니다.

find [경로] [조건] [동작]

경로는 탐색을 시작할 위치, 조건은 어떤 파일을 찾을지, 동작은 찾은 파일로 뭘 할지를 지정합니다. 조건과 동작을 생략하면 위에서 본 것처럼 모든 파일을 그냥 출력합니다.

이름으로 찾기: -name

파일 이름으로 검색할 때는 -name 옵션을 씁니다. Glob 패턴을 사용할 수 있어서 와일드카드(*, ?)로 유연하게 검색이 가능해요.

find src/components -name "*.astro"
결과
src/components/Logo.astro
src/components/ArticleFooter.astro
src/components/Search.astro
src/components/Footer.astro
src/components/ArticleContent.astro
src/components/IconButton.astro
src/components/MaxWidthWrapper.astro
src/components/Pagination.astro
src/components/ArticleHeader.astro
src/components/Nav.astro

-name은 대소문자를 구분합니다. "*.PNG"로 검색하면 .png 파일은 안 잡혀요. 대소문자를 가리지 않고 찾고 싶다면 -iname을 씁니다.

find src/assets/images -iname "*.png" -type f | head -3

이미지 파일은 확장자가 .PNG인 경우도 있으니까 -iname이 더 안전합니다.

정확한 파일명으로 찾을 수도 있습니다.

find . -name "package.json"

프로젝트 전체에서 package.json이 어디에 있는지 바로 확인할 수 있어요. node_modules 안에도 수많은 package.json이 있으니, 실제로는 뒤에서 배울 -not -path 같은 제외 조건과 함께 쓰는 경우가 많습니다.

타입으로 필터링: -type

find는 기본적으로 파일과 디렉토리를 구분하지 않고 전부 찾습니다. -type 옵션으로 원하는 종류만 골라낼 수 있어요.

find src -type d
결과
src
src/layouts
src/assets
src/assets/fonts
src/assets/images
src/assets/images/tags
src/content
src/content/tags
src/content/posts
src/utils
src/components
src/pages
src/pages/tag
src/pages/tag/[tag]
src/pages/tag/[tag]/page

-type d는 디렉토리만, -type f는 일반 파일만 찾습니다. 심볼릭 링크를 찾으려면 -type l을 쓰면 됩니다.

프로젝트의 디렉토리 구조를 파악하거나 파일 개수를 셀 때 유용해요.

find src/content/posts -type f -name "*.md" | wc -l
결과
704

마크다운 포스트가 704개나 되는군요. find로 파일 목록을 뽑고 wc -l로 줄 수를 세는 건 아주 흔한 조합입니다.

탐색 깊이 제한: -maxdepth, -mindepth

깊은 디렉토리까지 다 뒤지면 결과가 너무 많아질 수 있습니다. -maxdepth로 탐색 깊이를 제한할 수 있어요.

find . -maxdepth 1 -type f -name "*.json"
결과
./.stylelintrc.json
./package.json
./tsconfig.json

-maxdepth 1은 현재 디렉토리만 검색합니다. 하위 디렉토리로 들어가지 않으니 루트에 있는 설정 파일만 빠르게 찾을 때 딱이에요.

반대로 -mindepth는 최소 깊이를 지정합니다. -mindepth 2를 쓰면 현재 디렉토리 바로 아래에 있는 파일은 건너뛰고 더 깊은 곳에서만 찾습니다.

find src -mindepth 2 -maxdepth 2 -type f -name "*.ts"

-mindepth-maxdepth를 함께 쓰면 정확히 원하는 깊이의 파일만 잡아낼 수 있습니다.

크기로 필터링: -size

파일 크기로 검색하려면 -size 옵션을 씁니다.

find src/assets/images -size +100k -type f | head -5
결과
src/assets/images/apollo-connectors-sandbox.png
src/assets/images/neovim.png
src/assets/images/bigocalc-analytics-1.png
src/assets/images/stateofjs-intl-api.png
src/assets/images/state-of-js-2025-build-tools.png

+100k는 100KB보다 큰 파일, -100k는 100KB보다 작은 파일을 의미합니다. 100k처럼 부호 없이 쓰면 정확히 그 크기인 파일만 찾습니다.

크기 단위는 c(바이트), k(킬로바이트), M(메가바이트), G(기가바이트)를 쓸 수 있어요.

# 1MB 이상인 이미지 파일 찾기
find src/assets/images -size +1M -type f

# 빈 파일 찾기 (0바이트)
find src -size 0 -type f

# 10KB ~ 500KB 사이의 파일 찾기
find src -size +10k -size -500k -type f

프로젝트에서 용량이 큰 파일을 정리하거나, 빌드 결과물 중 비정상적으로 큰 파일을 찾을 때 유용합니다.

수정 시간으로 필터링: -mtime, -newer

파일의 수정 시간을 기준으로 검색하는 것도 됩니다. -mtime은 며칠 전에 수정되었는지를 기준으로 찾습니다.

# 7일 이내에 수정된 파일
find src -mtime -7 -type f

# 정확히 30일 전에 수정된 파일
find src -mtime 30 -type f

# 30일 이전에 수정된 파일
find src -mtime +30 -type f

-mtime -7-7은 “7일 미만”이라는 뜻입니다. 크기의 +/-와 같은 패턴이에요.

분 단위로 찾고 싶으면 -mmin을 씁니다. -mmin -60은 1시간 이내에 수정된 파일이에요.

특정 파일보다 새로운 파일을 찾을 때는 -newer가 편합니다.

find src -name "*.astro" -newer src/components/Nav.astro -type f | head -5
결과
src/layouts/BaseLayout.astro
src/components/Seo.astro
src/components/Tags.astro
src/components/Social.astro
src/components/TagNav.astro

Nav.astro보다 나중에 수정된 Astro 파일만 찾습니다. “이 파일 이후로 뭐가 바뀌었지?” 같은 질문에 답할 때 쓸 수 있어요.

논리 연산자: -and, -or, -not

조건을 여러 개 조합하면 더 정밀한 검색이 가능합니다. find는 기본적으로 여러 조건을 나열하면 AND로 처리합니다.

# -name과 -type을 같이 쓰면 AND
find src -name "*.ts" -type f

OR 조건은 -or(또는 -o)를 씁니다.

# TypeScript 또는 JavaScript 파일 찾기
find src -name "*.ts" -or -name "*.js" -type f

NOT 조건은 -not(또는 !)을 씁니다. 특정 조건을 제외할 때 유용해요.

find src -name "*.ts" -not -path "*/content/*" -type f
결과
src/utils/korean.ts
src/utils/tags.ts
src/utils/og.ts
src/utils/posts.ts
src/pages/rss.xml.ts
src/pages/og/[slug].png.ts
src/lib/integration-picture.ts
src/lib/remark-code-title.ts
src/data/navigation.ts

-not -path "*/content/*"content 디렉토리 안의 파일을 제외했습니다. -path-name과 달리 경로 전체를 기준으로 매칭하기 때문에 특정 디렉토리를 제외하는 데 쓸 수 있어요.

괄호를 쓰면 복잡한 조건도 만들 수 있습니다. 쉘에서 괄호는 특수 문자이므로 이스케이프(\(, \))해야 합니다.

# CSS 또는 ASTRO 파일 중 components 디렉토리에 있는 것만
find src \( -name "*.css" -or -name "*.astro" \) -path "*/components/*"

검색 결과로 명령어 실행: -exec

find의 진짜 힘은 찾은 파일에 바로 명령어를 실행할 수 있다는 점입니다. -exec 옵션을 쓰면 됩니다.

# 찾은 파일의 첫 줄을 출력
find src/utils -name "*.ts" -exec head -1 {} \;

{}는 찾은 파일명이 들어가는 자리이고, \;-exec의 끝을 표시합니다. 위 명령어는 src/utils 안의 TypeScript 파일마다 head -1을 실행해서 각 파일의 첫 줄을 보여줍니다.

\; 대신 +를 쓰면 찾은 파일을 모아서 한 번에 명령어를 실행합니다.

# 파일을 하나씩 처리 (느림)
find src/utils -name "*.ts" -exec wc -l {} \;

# 파일을 모아서 한 번에 처리 (빠름)
find src/utils -name "*.ts" -exec wc -l {} +

+ 방식이 훨씬 빠릅니다. wc -l을 파일마다 한 번씩 실행하는 대신, 한 번에 여러 파일을 넘겨주니까요. 가능하면 +를 쓰는 게 좋습니다.

-exec와 비슷하지만 실행 전에 확인을 받고 싶다면 -ok를 쓰면 됩니다. 파일을 삭제하는 것처럼 되돌리기 어려운 작업을 할 때 안전장치가 되어줘요.

# 삭제 전에 파일마다 확인 물어봄
find /tmp -name "*.log" -ok rm {} \;

자주 쓰는 조합: find + xargs

-exec 대신 파이프와 xargs를 조합하는 방법도 많이 씁니다.

find src/utils -name "*.ts" | xargs wc -l

xargs는 표준 입력으로 받은 목록을 명령어의 인수로 변환해줍니다. -exec {} +와 비슷한 효과인데, 파이프를 사용하니까 다른 명령어와 연결하기가 더 자유롭습니다.

파일명에 공백이 있으면 문제가 생길 수 있는데, 이때는 -print0xargs -0을 함께 씁니다.

# 공백이 포함된 파일명도 안전하게 처리
find src -name "*.md" -print0 | xargs -0 grep -l "published: false"

-print0은 파일명을 줄바꿈 대신 널(null) 문자로 구분하고, xargs -0은 그 구분자를 인식합니다. 파일명에 공백이나 특수 문자가 있어도 안전해요.

실전 활용 패턴

지금까지 배운 옵션을 조합하면 꽤 다양한 작업을 할 수 있습니다. 개발하면서 자주 쓰게 되는 패턴을 몇 가지 정리해봤어요.

# 프로젝트에서 특정 확장자 파일 개수 세기
find src -name "*.astro" -type f | wc -l

# node_modules 제외하고 검색
find . -name "*.json" -not -path "*/node_modules/*" -type f

# 빈 디렉토리 찾아서 삭제
find . -type d -empty -delete

# 권한이 777인 파일 찾기 (보안 점검)
find /var/www -perm 777 -type f

# 특정 사용자 소유의 파일 찾기
find /home -user dale -name "*.sh" -type f

# 최근 24시간 이내에 수정된 설정 파일 찾기
find /etc -mmin -1440 -name "*.conf" -type f

grep과 조합하면 파일을 찾고 그 안에서 내용까지 검색하는 강력한 파이프라인을 만들 수 있습니다.

# TypeScript 파일 중 console.log가 있는 것 찾기
find src -name "*.ts" -type f -exec grep -l "console.log" {} +

# 마크다운 파일에서 published: false인 것만 찾기
find src/content/posts -name "*.md" -exec grep -l "published: false" {} +

find로 파일 목록을 추린 다음 grep -l로 내용이 매칭되는 파일만 걸러내는 패턴이에요. grep -r만으로도 비슷한 검색을 할 수 있지만, find를 쓰면 파일 타입, 크기, 수정 시간 같은 조건을 먼저 걸 수 있어서 검색 범위를 더 정교하게 좁힐 수 있습니다.

fd: 더 빠른 대안

find의 문법이 좀 장황하다고 느낀다면 fd를 써볼 만합니다. find의 현대적 대안으로 만들어진 도구인데, 직관적인 문법과 빠른 속도가 특징이에요.

# find
find src -name "*.ts" -type f

# fd (동일한 검색)
fd -e ts src

fd.gitignore를 자동으로 존중하고 결과에 색상을 입혀주니까 개발 환경에서 쓰기엔 확실히 편합니다.

다만 find는 모든 Unix/Linux 시스템에 기본 설치되어 있다는 강점이 있어요. 서버에 SSH로 접속하거나 Docker 컨테이너 안에서 작업할 때 fd가 없을 수는 있어도 find가 없는 경우는 없다고 봐도 됩니다. 쉘 스크립트를 작성할 때도 이식성을 생각하면 find를 쓰는 게 안전하고요. find의 기본기를 익혀두면 어떤 환경에서든 파일 검색에 막히지 않습니다.

마치며

find는 파일 시스템을 탐색하는 가장 기본적인 도구입니다. 이름, 타입, 크기, 시간 같은 조건을 조합해서 원하는 파일을 정밀하게 찾을 수 있고, -exec로 찾은 파일에 바로 명령어를 실행할 수도 있어요.

처음에는 -name-type f 정도만 기억하고 써보세요. 그러다 -exec가 필요해지고, 논리 연산자로 조건을 조합하기 시작하면 find가 단순한 파일 검색 이상의 도구라는 걸 느끼게 될 겁니다. ls로 디렉토리 내용을 보고, find로 파일을 찾고, grep으로 내용을 검색하는 세 가지 조합만 익혀도 터미널에서 못 찾을 게 없어요.

더 자세한 옵션은 GNU find 매뉴얼을 참고하세요.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord