본문으로 바로가기
TaeyoungKim.dev

리눅스 find -name '*.log': 하위 폴더 파일이 안 보일 때 따옴표 확인법

리눅스작성 약 3분 읽기TaeyoungKim
LinkedInX

archive/worker.log가 보이는데 find 결과에는 app.log만 나온다. 파일을 옮긴 기억도 없다. 이럴 때는 find가 게으른 게 아니라, 명령을 받기 전에 셸이 *.log를 바꿔 놓았을 수 있다.

find -name은 파일의 이름과 내용 중 무엇을 찾을까?

find . -name '*.log'는 현재 위치(.)부터 내려가며 이름이 *.log와 맞는 경로를 찾는다. 파일 안에 error가 있는지는 읽지 않는다. 내용의 일치 줄을 찾는 grep과 질문이 다르다. '어느 파일인가?'에는 find, '그 파일의 어느 줄인가?'에는 grep이 맞다.

-name의 패턴에서 *는 이름의 앞부분이 무엇이든 될 수 있다는 뜻이다. 그런데 *를 따옴표 없이 쓰면 find보다 셸이 먼저 처리할 기회를 갖는다. 그 차이를 작은 폴더에서 확인해 보자.

*.log를 따옴표 없이 쓰면 왜 하위 파일이 빠질까?

기존 파일을 건드리지 않도록 임시 폴더에 로그 두 개를 만든다. 하나는 현재 폴더, 다른 하나는 archive 안에 있다.

bash
demo_dir=$(mktemp -d)
mkdir -p "$demo_dir/archive"
touch "$demo_dir/app.log" "$demo_dir/archive/worker.log"
cd "$demo_dir"
find . -type f -name *.log | sort
text
./app.log

현재 폴더에 app.log가 하나 있으므로 셸은 *.log를 그 이름으로 펼친다. find가 실제로 받은 조건은 -name app.log에 가깝다. archive/worker.log까지 내려가더라도 이름이 다르니 결과에서 빠진다. sort는 출력 순서를 일정하게 보기 위해 붙였으며 검색 범위를 바꾸지 않는다.

패턴을 작은따옴표로 감싸면 셸이 건드리지 않고 find에 넘긴다.

bash
find . -type f -name '*.log' | sort
text
./app.log
./archive/worker.log

따옴표는 장식이 아니다. '이 패턴을 셸이 아니라 find가 해석하게 하자'는 경계 표시다. 현재 폴더에 .log 파일이 여러 개 있거나 하나도 없다면, 따옴표 없는 명령의 실패 모습은 셸 설정에 따라 달라질 수 있다. 그래서 우연히 맞아떨어지는 결과를 기대하지 않는 편이 낫다.

find -type f와 -name은 무엇이 다를까?

이번에는 이름만 .log인 폴더도 만든다.

bash
mkdir "$demo_dir/old.log"
find . -name '*.log' | sort
text
./app.log
./archive/worker.log
./old.log

-name만 주면 이름이 맞는 파일과 디렉터리 모두 나온다. 일반 파일만 필요하다면 -type f를 더한다.

bash
find . -type f -name '*.log' | sort
text
./app.log
./archive/worker.log

반대로 폴더를 찾을 때는 -type d를 쓸 수 있다. 이름과 유형은 별개 조건이다. 서버에서 파일 목록을 다음 명령으로 처리하려 한다면, 그 전에 파일인지 폴더인지부터 구분하는 게 안전하다.

find 결과가 비어 있을 때 무엇부터 확인할까?

먼저 pwd로 시작 위치를 본다. find .의 점은 지금 서 있는 폴더이지 시스템 전체가 아니다. 다음으로 패턴을 따옴표로 감쌌는지, 찾는 대상이 일반 파일인지 디렉터리인지 확인한다.

결과가 없다는 사실만으로 명령이 실패한 것은 아니다. 예를 들어 이 폴더에 .txt 파일이 없으면 다음 검색은 아무 줄도 출력하지 않지만 정상 종료한다.

bash
find . -type f -name '*.txt'
echo $?
text
0

따라서 자동화에서 종료 상태 0만 보고 '파일을 찾았다'고 판단하면 안 된다. 일치한 경로가 실제로 있는지 따로 확인해야 한다. 또 권한이 없는 폴더까지 무작정 검색 범위를 넓히기보다, 먼저 해당 애플리케이션의 작업 폴더를 지정하자.

핵심 요약

find는 경로의 이름을 찾고, grep은 파일의 내용을 찾는다. 하위 로그가 빠진다면 find . -type f -name '*.log'처럼 패턴을 따옴표로 감싸 셸의 선행 확장을 막자. 그래도 결과가 비면 시작 경로와 -type을 확인하고, 정상 종료와 실제 검색 결과를 구분하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Linux#리눅스 find#find -name#파일 이름 검색#셸 와일드카드

함께 읽으면 좋은 글