Quick Reference
find . -name "*.log"
find /var/log -type f -mtime -1
find . -type f -size +100M
grep -n "ERROR" app.log
grep -F -n "a.b" app.log
grep -E -n "ERROR|WARN" app.log
grep -R "DATABASE_URL" .
grep -R --exclude-dir=node_modules "TODO" .| 목적 | 명령 |
|---|---|
| 이름으로 파일 찾기 | find . -name "*.conf" |
| 타입으로 좁히기 | find . -type f |
| 수정 시간으로 좁히기 | find . -mtime -1 |
| 내용에서 문자열 찾기 | grep -n "text" file |
| 정규식이 아닌 글자 그대로 찾기 | grep -F |
| 확장 정규식으로 찾기 | grep -E |
| 디렉터리 재귀 검색 | grep -R "text" . |
| 줄 번호 표시 | grep -n |
검색 기준
find는 파일 이름, 타입, 크기, 수정 시간 같은 파일 메타데이터를 기준으로 검색합니다. grep은 파일 내용의 텍스트를 검색합니다. "어떤 파일이 있는가"가 질문이면 find, "어느 파일 안에 문자열이 있는가"가 질문이면 grep이 먼저입니다.
find . -name "*.service"
grep -R "ExecStart" /etc/systemd/system큰 디렉터리에서 재귀 검색을 할 때는 제외 대상을 명시하는 것이 중요합니다. node_modules, .git, dist, build 같은 디렉터리를 그대로 검색하면 느리고 불필요한 결과가 많아집니다.
grep -R --exclude-dir=.git --exclude-dir=node_modules "API_KEY" .grep의 기본 패턴은 basic regular expression입니다. 점, 대괄호, *를 글자 그대로 찾으려면 -F를, |, +, ? 같은 확장 정규식을 쓰려면 -E를 명시합니다. 검색어가 shell 변수나 사용자 입력에서 왔다면 "$pattern"처럼 인용해 shell의 단어 분할과 glob 확장을 막습니다.
find 결과를 실행 명령으로 넘길 때는 공백을 고려한다
파일명에 공백이나 특수 문자가 있을 수 있으므로, 대량 삭제나 이동에는 결과를 눈으로 확인한 뒤 실행해야 합니다. find ... -print로 목록을 먼저 보고, 정말 의도한 대상만 잡히는지 확인합니다.
find . -name "*.tmp" -print
find . -name "*.tmp" -delete파일명에는 줄바꿈도 들어갈 수 있으므로 find 출력을 줄 단위로 파싱하거나 일반 xargs에 바로 넘기지 않습니다. 다른 명령으로 넘길 때는 NUL 구분을 유지하거나 find -exec를 씁니다.
find ./logs -type f -name '*.tmp' -print0 | xargs -0 -- rm --
find ./logs -type f -name '*.tmp' -exec rm -- {} +--는 이후 인자를 option이 아닌 파일명으로 처리하게 합니다. 위 형태도 삭제이므로 먼저 -print로 범위를 확인한 뒤에만 실행합니다.
선택 기준
| 상황 | 선택 |
|---|---|
| 파일 이름 패턴 검색 | find -name |
| 파일 내용 검색 | grep |
| 특정 디렉터리 제외 | --exclude-dir |
| 최근 변경 파일 찾기 | find -mtime, find -mmin |
| 큰 파일 찾기 | find -size |
| 검색 후 삭제 | 목록 확인 후 -delete |
주의할 점
find ... -delete는 되돌리기 어렵습니다. 삭제 조건은 -print로 먼저 확인하고,
검색 루트가 /나 홈 디렉터리 전체처럼 넓지 않은지 확인하십시오.
find ./logs -name "*.tmp" -print
find ./logs -name "*.tmp" -delete참고 링크
2 sources