find야 너 돌고 있니??

윤효준·2026년 1월 5일

콤퓨타 공부

목록 보기
18/18

문제의 시작

문제의 시작은 꽤 사소했다.

나는 평소에 내 MacBook을 CleanMyMac이라는 프로그램으로 관리하고 있다.
정기적으로 캐시를 정리하고, 보호 기능도 한 번씩 돌려주는 편이다.

그런데 어느 순간부터 이상한 일이 생겼다.
보호 기능이 끝나지를 않았다.

잠깐 시간이 걸리는 정도가 아니라,
Zoom.pkg를 기준으로 너무 많은 파일과 경로를 탐색하고 있었고,
도대체 언제 끝날지 감이 오지 않았다.

“조금만 더 기다리면 끝나겠지” 하고 놔두기엔
진행 바는 거의 움직이지 않았고,
로그를 보고 있자니 UUID만 달라진 채
{UUID}/Zoom.pkg 형태의 경로를 계속, 계속 탐색하고 있었다.

이쯤 되니 단순히

“아, 파일이 많네?”

가 아니라

“워메 이거 뭐여?”
“뭐가 이리 많은겨?”

라는 생각이 먼저 들었다.


일단 Zoom부터 지워보자

그래서 처음에는 이렇게 생각했다.

“아, 예전에 Zoom을 깔았던 흔적인가 보다.”

그래서 가장 먼저 한 행동은 Zoom 삭제였다.


근데… 이게 맞나?

근데 가만히 생각해 보니 뭔가 이상했다.

Zoom.pkg는 이름 그대로
Zoom을 설치하기 위한 패키지 파일이다.

이미 Zoom 앱(zoom.us.app)은 삭제했는데도 불구하고,

  • CleanMyMac은 여전히 Zoom.pkg를 찾고 있었고
  • 그것도 한두 개가 아니라 여전히 굉장히 많이 탐색하고 있었다.

그래서 이런 생각이 들었다.

“나 너 어디 있는지 직접 찾아봐야겠다.”


find를 써보자

그래서 터미널을 열고 다음 명령어를 실행했다.

find /Users/yoonhyojun/Library/Containers -name "zoom.pkg" -print

그런데…

아래 상태에서 계속 가만히 있는 것처럼 보였다.

커서는 깜빡이는데,
이게 동작을 하고 있는 건지,
아니면 렉이 걸린 건지 도무지 알 수가 없었다.

“파일이 너무 많아서 그런가?” 싶어서
첫 번째 발견 즉시 종료하도록 -quit 옵션도 추가해 봤지만,
결과는 똑같았다.


그럼… 어디를 보고 있는지라도 보자

그래서 현재 탐색 중인 디렉토리를 출력하도록 바꿔봤다.

find /Users/yoonhyojun/Library/Containers \
  \( -type d -print \) \
  -o \
  \( -name "zoom.pkg" -print -quit \)

여기서 -oOR이다.

find는 각 경로에 대해
왼쪽 → 오른쪽으로 조건을 평가하고,
각 조건은 true / false를 반환한다.

  • 디렉토리(-type d)면 true-print
  • 디렉토리가 아니면 false → 다음 조건 평가

OR의 short-circuit 특성을 활용한 것이다.


범인은 tmp였다

이렇게 돌려보니,
아래처럼 항상 tmp 디렉토리에서 멈춘 것처럼 보였다.

“디렉토리만 출력해서 그런가?”
“파일이 너무 많은가?”

싶어서, 파일을 하나 확인할 때마다 .을 찍도록 수정했다.

find /Users/yoonhyojun/Library/Containers \
  \( -type d -print \) \
  -o \( -exec printf "." \; -false \) \
  -o \( -name "zoom.pkg" -print -quit \) \
  2>/dev/null
  • 디렉토리 → 출력
  • 디렉토리가 아니면 → . 출력

그런데도 여전히 tmp에서 멈춘 것처럼 보였다.


그럼 tmp를 지워보자

그래서 생각했다.

“CleanMyMac tmp잖아?
그냥 지워도 되는 거 아니야?”

물론 바로 지우지는 않고,
ls로 살짝 확인은 해봤다.

.../Data/tmp/31A93FAD-9F90-47FB-9E7E-EE2665CBA48F

끝이 UUID로 된 디렉토리들이 잔뜩 있었다.
“아, 이 녀석들이구나” 싶었다.

그래서 다음 명령을 실행했다.

rm -rf /Users/yoonhyojun/Library/Containers/com.macpaw.CleanMyMac-mas/Data/tmp/*

그런데 돌아온 결과는 이거였다.

zsh: argument list too long: rm

argument list too long?

처음엔 이게 무슨 소린가 싶었다.

알고 보니 * 와일드카드는
rm이 아니라 zsh가 먼저 확장한다.

즉 내부적으로는 이런 형태가 되는 것이다.

rm -rf file1 file2 file3 file4 ... (수천~수만 개)

이렇게 되면
execve() 시스템 콜의 인자 길이 제한인 ARG_MAX를 초과하게 된다.

그래서 에러가 난 것이었다.


다시 find의 차례

“그럼 이걸 하나하나 지워야 하나?” 싶었는데,
이미 쓰고 있던 find를 그대로 쓰면 된다.

find /Users/yoonhyojun/Library/Containers/com.macpaw.CleanMyMac-mas/Data/tmp \
  -mindepth 1 \
  -exec rm -rfv {} +
  • -mindepth 1
    tmp 디렉토리 자체(depth 0)는 삭제하지 않기 위해
  • {}
    → find가 찾은 각 경로
  • +
    → ARG_MAX를 고려해 가능한 만큼 묶어서 실행

findOS의 ARG_MAX 제한을 스스로 계산해서
넘치면 자동으로 여러 번 나눠 실행해 준다.


드디어 정체를 만나다

삭제 로그를 보니 이런 구조가 보였다.

{UUID}/Zoom.pkg

그제서야 이해가 됐다.

내가 찾고 있던 Zoom.pkg
실제 설치 파일이 아니라,
CleanMyMac이 tmp에 풀어놓은 분석용 복사본이었다.


이제 잘 돌아간다~

다 삭제가 완료된 후에 CleanMyMac을 실행해보니 보호 기능 탐색이 끝나는 것을 확인할 수 있었다!

profile
작은 문제를 하나하나 해결하며, 누군가의 하루에 선물이 되는 코드를 작성해 갑니다.

0개의 댓글