리눅스 많은 파일 빨리 지우기, rm 명령어를 이용해서 많은 파일 삭제 하기
페이지 정보
작성자 서방님 댓글 1건 조회 673회 작성일 14-02-15 08:16본문
유닉스에서 파생된 서브 디렉토리 구조는 이제 많이 쓰이는 OS인 윈도우, 리눅스에서 모두 쓰이고 있다. 서브 디렉토리는 한 디렉토리에 너무 많은 파일을 담지 않도록 하기 위해 필요한 구조이다. 내 경험상 한 디렉토리에 1만개 정도의 파일이 들어가면 버벅이기 시작한다.
여기서 버벅인다는 뜻은, ls를 하거나 파일을 찾거나 할 때 반응 속도가 느리다는 것이다. 이것이 치명적일 경우가 있는데, 엠 사이트의 경우 제로보드 기반의 연재란을 사용하고 있다. 게시판을 하나 만들면 테이블을 4개 만들고 각각 myisam 파일이 3개 생기므로 총 12개의 파일을 만들게 된다. 연재란이 천 개만 되면 myisam 구조의 테이블을 사용하는 경우 한 디렉토리에 파일 수가 1만 2천개가 된다.
실제로 이렇게 되면 특정 테이블을 불러오는데 시간이 걸리게 된다. 일단 불러오면 캐쉬에 들어가서 빠르지만 불러올 떄까지가 서버의 시간 기준으로 보면 영원에 가까울 정도로 느려지게 된다.
비슷한 경우가 세션 디렉토리에서 일어나게 된다. 접속하는 사용자가 많아질수록 세션수가 늘어나고 세션 디렉토리에 많은 파일이 쌓여서 성능이 급격히 떨어지게 된다. 이때도 세션수가 1만개 이상이 되면 성능이 급격히 떨어지는 것을 목격했다(델 2589인가의 기종에서) PHP의 경우 session.save_path = "N;/path"(php.ini 참고)에서 N 값을 주면 된다. 이 경우 가비지 콜렉션을 따로 해줘야 한다.
이상은 사전 설명이고, 어제 디 사이트에서 세션 가비지 콜렉션을 해주지 않아서 세션 디렉토리 밑으로 몇 기가에 해당하는 엄청난 세션이 쌓인 경우가 발생했다. 보통 디렉토리를 한꺼번에 지울 경우
rm -rf "해당 디렉토리 이름"
을 사용하는데 해당 디렉토리에 파일이 너무 많을 경우 일단 디렉토리 내의 파일을 읽어들이는 데 엄청난 시간이 들어서 파일 하나 지우는데 거의 46초(듀얼 코어x2, SAS HDD에서) 가량 걸리게 된다.
for 문으로 적당한 길이로 잘라 파일명 뒤에 *를 붙일 경우에도 너무 파일 수가 많으면 쉘에서 *의 확장을 제대로 못하게 되서 에러가 난다. 위의 rm -rf 의 경우도 마찬가지이다. 실제로 지우는 시간보다 *의 확장에 시간이 더 걸리게 된다. 막상 확장해보니 지울 것이 없어도 말이다.
그래서 '많은 파일 지우기', 'delete million files', 'fast delete' 등으로 구글링을 해본 결과 다음과 같은 것을 발견했다.
http://perlog.pung96.net/entry/한꺼번에-많은-파일-지우는-세가지-방법
http://genomes.kr/4
SUMMARY: Deleting Millions of Files
아무튼 위 링크들을 읽고 직접 시험해 본 결과 파일 수가 많을 경우 rm -rf * 식은 곤란하다. 쉽게 말해 ls 를 해서 느려지는 속도만큼의 지연이 발생하는 것 같다.
시험해 본 결과 제일 빠른 방법은
find ./ -name "*.bak" -type f | perl -nleunlink
==============================================================
ls | xargs -n1000 rm -f
위의 작업은 ls 로 인수를 받은다음 -n 옵션으로 1000개씩 끊어서 rm -f 를 하는 방법임
댓글목록
서방님님의 댓글
서방님 작성일
<p><span style="FONT-FAMILY: Gulim">현재 디렉토리에서 </span><span style="FONT-FAMILY: Gulim">세션 파일 삭제</span></p>
<p><span style="FONT-FAMILY: Gulim">find ./ -name "sess*" -type f | perl -nleunlink</span></p>
<p><span style="FONT-FAMILY: Gulim"></span> </p>
<p><span style="FONT-FAMILY: Gulim">현재 디렉토리의 파일 개수 확인</span></p>
<p><span style="FONT-FAMILY: Gulim">ls -l | grep ^<b>-</b> | wc -l<br /><br /></span></p>