IT/작업기록

[Linux] rm -rvf가 아무 일도 안 했던 이유 — 대상을 빼먹었다

aram 2026. 8. 5. 08:16

상황

CI 임시 워크트리 잔여물을 지우려는데, 분명 전에는 잘 지워졌던 명령인데 이번엔 아무 반응이 없었다.

잘 됐던 경우:

$ sudo rm -rvf /volume1/docker/django/<project>-dev/_ci_worktrees/<커밋해시>
removed '.../.pytest_cache/README.md'
removed '.../.pytest_cache/.gitignore'
removed '.../.pytest_cache/CACHEDIR.TAG'
removed '.../.pytest_cache/v/cache/nodeids'
removed directory '.../.pytest_cache/v/cache'
removed directory '.../.pytest_cache/v'
removed directory '.../.pytest_cache'
removed directory '.../<커밋해시>'

exit code: 0

안 됐던 경우:

<계정>@<호스트>:/volume1/docker/django/<project>-dev/_ci_worktrees$ sudo rm -rvf
<계정>@<호스트>:/volume1/docker/django/<project>-dev/_ci_worktrees$

아무 출력도 없이 그냥 프롬프트로 돌아왔다.

처음 의심했던 것 — -v 옵션 차이?

rm -rf와 rm -rvf는 기능적으로 완전히 동일하다(-v는 그냥 삭제 과정을 출력해주는 옵션일 뿐). 즉 "지워지는지 여부"에는 차이가 없다. 옵션 차이 때문은 아니었다.

진짜 원인 — 삭제할 대상(경로)을 안 적었다

rm 뒤에 삭제할 대상(파일/폴더명)이 없으면, rm은 아무 일도 하지 않는다. (정확히는 rm: missing operand 에러를 내고 끝난다.) 안 됐던 명령을 다시 보면:

sudo rm -rvf

옵션(-rvf)만 있고 정작 지울 대상이 빠져 있었다. 옵션만 줘서는 아무것도 지워지지 않는다.

해결

그 디렉터리 안에 들어가 있는 상태라면:

cd /volume1/docker/django/<project>-dev/_ci_worktrees
sudo rm -rvf *

*는 현재 디렉터리 안의 모든 파일/폴더를 가리키는 셸 와일드카드다. 아니면 특정 폴더 하나만 지정해서:

sudo rm -rvf <커밋해시>

이렇게 이름을 직접 써줘야 삭제된다.

참고 — -f 옵션이 오해를 더 키울 수 있는 이유

비슷하게 헷갈릴 수 있는 케이스로, -f 옵션은 "그런 파일/디렉터리가 없음" 에러조차 조용히 삼켜버린다. 그래서:

  • 경로를 복사-붙여넣기하다가 해시값에 오타가 있거나, 안 보이는 공백/특수문자가 끼어 있거나
  • 다른 셸 세션에서 명령을 치고 확인은 다른 세션에서 했거나

이런 경우에도 rm -rf는 "대상 없음 → 아무것도 안 함 → 에러도 안 냄"으로 조용히 끝나버려서, 뭐가 잘못됐는지 알기 어렵다. (이번 케이스는 그게 아니라 아예 대상 자체가 빠진 경우였지만, 두 상황 모두 겉보기엔 "명령을 쳤는데 반응이 없다"는 점에서 비슷하게 헷갈릴 수 있다.)

정리

  • rm은 대상 없이 옵션만 주면 삭제 자체가 불가능한 게 아니라, 애초에 아무 일도 하지 않는다
  • -v를 습관적으로 붙이면 "무엇을 지웠는지"가 눈에 보여서 이런 문제를 바로 알아챌 수 있다
  • 삭제 명령 뒤엔 항상 대상 경로가 실제로 들어갔는지 확인하는 습관이 필요하다 — 특히 -f 옵션과 같이 쓸 때는 조용히 실패하기 때문에 더 조심해야 한다