리눅스에서 파일이나 폴더를 삭제하려고 할 때 간혹 "/bin/rm: 인수 목록이 너무 깁니다(Argument list too long)" 오류가 발생하는 경우가 있습니다. 이 글에서는 이 오류가 왜 생기는지, 그리고 어떻게 해결할 수 있는지 간단히 정리해 보겠습니다.
오류 발생 예시
root@dwarf /var/spool/clientmqueue # rm spam-*
/bin/rm: Argument list too long.
오류가 발생하는 원인
리눅스에서 위와 같은 오류 메시지를 본 적이 있으신가요? 이 오류는 디렉터리 안에 파일이 너무 많을 때 발생합니다. 셸(shell)은 와일드카드(*)를 확장하는 과정에서 시스템이 허용하는 인수 목록 크기 제한을 초과하게 되므로, 평소처럼 간단한 rm -rf * 명령으로는 파일을 삭제할 수 없습니다.
해결 방법: find와 xargs 조합하기
저도 이 문제를 여러 번 겪었는데, 온라인에서 관련 자료를 충분히 찾아본 끝에 아주 깔끔한 해결책을 찾을 수 있었습니다. 바로 find 명령과 xargs 명령을 파이프(|)로 연결하는 방법입니다.
find . -name 'spam-*' | xargs rm
위 예제의 명령은 현재 디렉터리(.)에서 spam-으로 시작하는 이름을 가진 모든 파일을 찾아 차례대로 삭제합니다. 검색 패턴인 spam-*는 원하는 값으로 얼마든지 바꿔 사용할 수 있습니다. 만약 해당 폴더 안의 모든 파일을 삭제하고 싶다면 패턴을 단순히 *(별표) 하나로 지정하면 됩니다.
find . -name '*' | xargs rm
xargs를 사용해야 하는 이유
find의 결과를 곧바로 rm에 넘기면 결국 동일한 오류가 다시 나타날 수 있습니다. 반면 xargs는 입력받은 파일 목록을 일정한 크기로 나누어 명령어에 전달해 주기 때문에 인수 목록 길이 제한을 피할 수 있습니다. 덕분에 파일이 수만, 수십만 개여도 안정적으로 삭제 작업을 처리할 수 있습니다.
마무리
리눅스 find 명령어의 다양한 활용법에 대해서는 별도의 상세 가이드도 마련되어 있으니 함께 참고하시면 큰 도움이 될 것입니다. 개인적으로 xargs는 그동안 잘 접하지 못했던 명령어였는데, 다른 명령어에 다수의 인자를 손쉽게 전달할 수 있게 해주는 매우 유용한 도구입니다. 한 번 익혀두면 대량의 파일을 다루는 작업이 훨씬 편해질 것입니다.