본문 바로가기
프로그래밍/리눅스

프로그래밍 「 리눅스 편」1만 개의 파일을 제거하는 방법

by grapedoukan 2023. 6. 11.
728x90

님이 촬영 한 사진 마놀로 크레티앙 on Unsplash

프로덕션 서버는 수시로 정리해야 하는 수많은 파일을 축적할 수 있습니다. 예를 들어 로그, 캐시 또는 스크립트에서 생성된 기타 파일입니다.

조만간 이 혼란을 없애야 합니다.

$ rm /tmp/logs/*.log

파일 수가 매우 많은 경우 어느 시점에서 파일을 삭제하는 대신 콘솔에 다음 메시지가 표시됩니다.

/bin/rm: Argument list too long.

안 돼! 이것은 무엇을 의미합니까?

문제

사실 rm, cp 또는 find와 같은 명령에서 마스크를 사용하면 Linux 시스템에서 그 자체로 편리한 형식으로 변환되어 사람이 이해할 수 있는 명령을 마스크 아래의 파일 목록으로 변환합니다.

# this is what you're typing in the terminal
rm /tmp/logs/*.log

# this is what is about to execute when you hit "enter"
rm /tmp/logs/1.log /tmp/logs/2.log /tmp/logs/3.log ...

rm 명령에 대한 인수가 허용 한계를 초과할 때 문제점이 시작됩니다. 그런데, 이 한계는 getconf 명령을 사용하여 쉽게 확인할 수 있습니다.

$ getconf ARG_MAX
262144

그렇다면 결국 백만 개의 파일을 제거하는 가장 좋은 방법은 무엇입니까?

For 루프 사용

많은 수의 파일을 제거하는 가장 쉬운 방법은 for 루프에서 필요한 명령을 실행하는 것인데, 여기에는 두 가지 중요한 이점이 있습니다. 첫째, 루프는 리소스를 많이 사용하며 인수 수에 제한이 없습니다. 둘째, 파일 삭제보다 더 복잡한 작업을 수행해야 하는 경우 루프에 추가 논리를 쉽게 래핑할 수 있습니다.

예를 들어 한 줄로 모든 파일을 삭제하는 방법은 다음과 같습니다.

for f in /tmp/logs/*.log; do rm "$f"; done

또는 7일이 지난 파일을 삭제합니다.

for f in /tmp/logs/*.log
do
  find $f -mtime +7 -exec rm {} \;
done

또는 파일 수를 계산하고, 변수에 쓰고, 번호를 표시합니다.

FILES_COUNT=`c=0; for f in /tmp/logs/*.log ; do ((c++)); done ; echo $c`
echo "$FILES_COUNT log files left";

기억해야 할 것들

  • 자전거를 재발명하지 말고 LogRotate와 같은 도구를 사용하여 자동 회전 및 로그 파일 압축을 관리하십시오
  • 프로덕션 서버에서 사용 가능한 디스크 공간을 항상 모니터링하고 디바이스에 남아 있는 공간이 충분하지 않은 경우 자동 경고를 설정합니다
  • 라이브 서버에서 실수로 모든 항목을 삭제하지 않도록 실행하기 전에 터미널 명령을 두 번 읽으십시오.
728x90