리눅스에서 파일을 찾는 방법
이 글은 리눅스 환경에서 파일을 찾는 방법을 정리한 글이다. 리눅스 핵심 레퍼런스를 참고하여 작성하였다.
기준 환경:
Ubuntu 20.04.1 LTS (WSL2 by Windows 10 x64)
파일을 찾는 명령의 종류
Command | Description |
---|---|
find | 파일, 디렉토리 검색 중 가장 많은 옵션을 제공한다. 상대적으로 느리다. |
locate (mlocate) | 파일, 디렉토리 Index를 만들고, 해당 Index 로 검색을 수행한다. |
which | 셸의 탐색 경로 내에서 명령어의 위치를 찾는다. |
type | Bash 셸 내장 프로그램으로 which와 같은 기능이지만 더 빠르다. |
whereis | 매개변수로 주어진 디렉토리 목록에 대해 탐색한다. |
find
find의 경우 Man Page가 굉장히 어려워 35 Practical Examples of Linux Find Command를 참고했다. 해당 페이지 제목에서도 알 수 있듯, 한 명령어 설명에 35개의 예제가 들어간다는 것부터 범상치 않음을 짐작할 수 있다. find는 정말 그 기능이 너무나 많다. 정말 강력하다고 할 수 있으나 인덱싱이 지원되지 않아 탐색 대상이 늘어나면 꽤 느려져서 전체 디렉토리 대상으로 수행할 거라면 Interactive한 일회성 작업에 적절할 것 같다.
아래의 모든 옵션은 직접 테스트 후 작성하였다.
1. 공통 기능
Option | Description | Example | Output |
---|---|---|---|
! | 옵션 앞에 ! 를 붙이면 NOT 조건이 된다. |
find ! -name "*.txt" |
“*.txt”에 매칭되지 않는 파일, 디렉토리만 출력 |
2. 이름 기반 검색
Option | Example | Ouput |
---|---|---|
(x) | find |
하위 디렉토리 전부 재귀적으로 출력 (grep 하려면 전체 방문을 기다려야 함) |
-name | find -name input.txt |
하위 디렉토리에서 input.txt 를 찾아 출력 |
-name “패턴” | find -name "*.txt" |
*.txt에 매칭되는 파일/디렉토리 검색 (* 만 사용 가능한지 모르겠음) |
(폴더 명시) | find /bin (options...) |
/bin 아래에서 검색을 수행 |
-type | `find -type (f | d)` |
3. 권한 기반 검색
권한 비트 앞에 0, 1, 2 등 한 바이트가 더 표현할 수 있는데 SGID, Sticky Bit 등의 내용에 대해 잘 이해하고 있지 못해서 생략했다. 추후 보강하겠다.
Options | Example | Output |
---|---|---|
-perm 권한 | find -perm 777 |
권한이 777인 파일, 디렉토리를 출력 |
-perm /권한 | find -perm /u=r |
(이 부분은 스펙과 출력이 달라서 추후 갱신할 예정입니다.) user 권한이 r인 파일(Read-only), 디렉토리를 출력 (대신 첫 글자만 해석함. rw 등 안 됨) |
4. 출력에 대해 다른 명령어 수행
-exec
옵션이 있는데, -exec COMMAND {} \;
와 같이 표시하는 형태이다. {}
가 각 라인이 들어갈 placeholder인 듯하다. 다만 이는 Pipelining으로도 충분히 가능해보여서 (-exec은 스트리밍을 지원하는건가?) 설명은 생략한다.
5. 소유자 기반 검색
Option | Example | Output |
---|---|---|
-user 소유자명 | find -user root |
root 소유의 파일, 디렉토리 출력 |
-group 그룹명 | find -group sb |
sb 소유의 파일, 디렉토리 출력 (sb는 제 유저명입니다) |
참고로 그룹의 목록은 /etc/group 파일에 텍스트로 저장돼있다 :)
6. 시간 속성 기반 검색
Option | Example | Output |
---|---|---|
-mtime N | find ~ -mtime 1 |
1일 내에 변경된 ~ 내의 파일 출력 |
-atime | 접근 시각 기준 | |
-mtime +N -mtime -M | find ~ -mtime +50 -mtime -100 |
N일보다 더 지나고 N일 보다 덜 지난 날짜 사이에서 변경된 ~ 내의 파일 출력 |
-cmin/mmin N | find -cmin/mmin 60 |
현재 디렉토리 아래에 변경된 지 60분 이내의 파일 출력 |
-amin N | find -amin 60 |
현재 디렉토리 아래에 접근한 지 60분 이내의 파일 출력 |
7. 파일 크기 기반 검색
Option | Example | Output |
---|---|---|
-size N | find -size 50M |
50M인 파일 출력 |
-size +N -M | find -size +50M -100M |
50M ~ 100M인 파일 출력 (초과, 미만) |
locate
파일, 디렉토리 Index를 만들고, 해당 Index 로 검색을 수행한다.
기본 Index 파일이 생성되는 경로는 /var/lib/mlocate/mlocate.db
이다.
Index에서 검색하므로 가장 빠르다.
Options | Example | Output |
---|---|---|
-b \NAME (–basename) | locate \input.txt |
input.txt와 일치하는 이름을 가진 모든 파일/디렉토리를 출력 |
which, type
셸의 탐색 경로 내에서 명령어의 위치를 찾는다.
Options | Output |
---|---|
-a | 명령어에 대한 모든 일치하는 바이너리 위치를 출력 |
whereis
매개변수로 주어진 디렉토리 목록에 대해 탐색한다.
whereis -bm ls tr -m gcc
: ls, tr 검색어에 대해 Binary, ManPage 검색 + gcc 검색어에 대해 ManPage 검색
Options | Description | Output |
---|---|---|
-b (binary) | 검색어에 대응되는 바이너리 검색을 한다 | |
-B,M,S [directories…] | -b/m/s 옵션으로 검색 시 탐색할 디렉토리 | |
-m (manual) | 검색어에 대응되는 매뉴얼 검색을 한다 (Man Page) | |
-s (sources) | 검색에어 대응되는 소스파일 검색을 한다 | |
-f | -B, -M, -S 옵션 사용시 반드시 사용해야 함. 찾을 검색어와 옵션의 구분자 역할을 한다 |
TODO:
- find 이외에는 문서가 자세하고 정확한 경우는 잘 없어서 조사가 더 필요할 것 같다.