문제의 시작은 꽤 사소했다.
나는 평소에 내 MacBook을 CleanMyMac이라는 프로그램으로 관리하고 있다.
정기적으로 캐시를 정리하고, 보호 기능도 한 번씩 돌려주는 편이다.
그런데 어느 순간부터 이상한 일이 생겼다.
보호 기능이 끝나지를 않았다.
잠깐 시간이 걸리는 정도가 아니라,
Zoom.pkg를 기준으로 너무 많은 파일과 경로를 탐색하고 있었고,
도대체 언제 끝날지 감이 오지 않았다.
“조금만 더 기다리면 끝나겠지” 하고 놔두기엔
진행 바는 거의 움직이지 않았고,
로그를 보고 있자니 UUID만 달라진 채
{UUID}/Zoom.pkg 형태의 경로를 계속, 계속 탐색하고 있었다.

이쯤 되니 단순히
“아, 파일이 많네?”
가 아니라
“워메 이거 뭐여?”
“뭐가 이리 많은겨?”
라는 생각이 먼저 들었다.
그래서 처음에는 이렇게 생각했다.
“아, 예전에 Zoom을 깔았던 흔적인가 보다.”
그래서 가장 먼저 한 행동은 Zoom 삭제였다.
근데 가만히 생각해 보니 뭔가 이상했다.
Zoom.pkg는 이름 그대로
Zoom을 설치하기 위한 패키지 파일이다.
이미 Zoom 앱(zoom.us.app)은 삭제했는데도 불구하고,
Zoom.pkg를 찾고 있었고그래서 이런 생각이 들었다.
“나 너 어디 있는지 직접 찾아봐야겠다.”
그래서 터미널을 열고 다음 명령어를 실행했다.
find /Users/yoonhyojun/Library/Containers -name "zoom.pkg" -print
그런데…
아래 상태에서 계속 가만히 있는 것처럼 보였다.

커서는 깜빡이는데,
이게 동작을 하고 있는 건지,
아니면 렉이 걸린 건지 도무지 알 수가 없었다.
“파일이 너무 많아서 그런가?” 싶어서
첫 번째 발견 즉시 종료하도록 -quit 옵션도 추가해 봤지만,
결과는 똑같았다.
그래서 현재 탐색 중인 디렉토리를 출력하도록 바꿔봤다.
find /Users/yoonhyojun/Library/Containers \
\( -type d -print \) \
-o \
\( -name "zoom.pkg" -print -quit \)
여기서 -o는 OR이다.
find는 각 경로에 대해
왼쪽 → 오른쪽으로 조건을 평가하고,
각 조건은 true / false를 반환한다.
-type d)면 true → -printfalse → 다음 조건 평가OR의 short-circuit 특성을 활용한 것이다.
이렇게 돌려보니,
아래처럼 항상 tmp 디렉토리에서 멈춘 것처럼 보였다.

“디렉토리만 출력해서 그런가?”
“파일이 너무 많은가?”
싶어서, 파일을 하나 확인할 때마다 .을 찍도록 수정했다.
find /Users/yoonhyojun/Library/Containers \
\( -type d -print \) \
-o \( -exec printf "." \; -false \) \
-o \( -name "zoom.pkg" -print -quit \) \
2>/dev/null
. 출력그런데도 여전히 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
처음엔 이게 무슨 소린가 싶었다.
알고 보니 * 와일드카드는
rm이 아니라 zsh가 먼저 확장한다.
즉 내부적으로는 이런 형태가 되는 것이다.
rm -rf file1 file2 file3 file4 ... (수천~수만 개)
이렇게 되면
execve() 시스템 콜의 인자 길이 제한인 ARG_MAX를 초과하게 된다.
그래서 에러가 난 것이었다.
“그럼 이걸 하나하나 지워야 하나?” 싶었는데,
이미 쓰고 있던 find를 그대로 쓰면 된다.
find /Users/yoonhyojun/Library/Containers/com.macpaw.CleanMyMac-mas/Data/tmp \
-mindepth 1 \
-exec rm -rfv {} +
-mindepth 1tmp 디렉토리 자체(depth 0)는 삭제하지 않기 위해{}+find는 OS의 ARG_MAX 제한을 스스로 계산해서
넘치면 자동으로 여러 번 나눠 실행해 준다.
삭제 로그를 보니 이런 구조가 보였다.
{UUID}/Zoom.pkg

그제서야 이해가 됐다.
내가 찾고 있던 Zoom.pkg는
실제 설치 파일이 아니라,
CleanMyMac이 tmp에 풀어놓은 분석용 복사본이었다.
다 삭제가 완료된 후에 CleanMyMac을 실행해보니 보호 기능 탐색이 끝나는 것을 확인할 수 있었다!