728x90
반응형

리눅스에서 여러 디렉토리에 대량의 파일이 쌓여 삭제해야할 때 적지 않은 시간이 걸리는 것을 확인할 수 있었다.
그래서 어떻게 하면 더 빠르게 대량의 파일들을 삭제할 수 있는 방법이 없을까 찾아보았다.

$ rsync

그래서 찾은 명령어가 rsync 명령어다.
보통 rsync 명령어를 통해 특정 디렉토리를 백업할 때 사용하거나 동기화 시킬때 주로 사용하곤 한다.
rsync 라는 명령어를 사용해서 대량의 파일들을 삭제하는 방법을 보게 되었는데 얼마나 빠른지 직접 사용해보고 시간을 재보았다.

 

아, 우선 rsync 를 사용해 대량의 파일들을 삭제하는 방법으로
비어있는 디렉토리를 생성하고 대량의 파일들이 들어있는 디렉토리를 비어있는 디렉토리에 동기화 시키는 것이다.
그럼 대량의 파일들이 들어있는 디렉토리가 비어있는 디렉토리에 동기화되면서 대량의 파일들이 지워지게 된다.
간단하게 말해 대량의 파일들이 들어있는 디렉토리를 비어있는 디렉토리와 똑같이 만들어준다는 말이다.

직접 사용해보면 보다 쉽게 이해할 수 있기 때문에 예를 들어서 사용해봤다.
test 라는 디렉토리를 만들고 touch 명령어와 seq 명령어를 사용해 1000개의 비어있는 파일을 생성했다.

$ touch $(seq 1 1000)

 

첫 번째 방법으로 find 명령어로 파일을 찾아 rm 명령어를 통해 삭제한다.

time 명령어를 사용해서 명령어 실행시간을 측정해봤는데 대략 0.72초 정도 걸린 것 같다.

$ time find ./test -type f -exec rm -rf {} \;
find ./test/ -type f -exec rm -rf {} \;  0.72s user 1.14s system 81% cpu 2.278 total

 

 

두 번째 방법으로 rsync 명령어를 사용해 비어있는 디렉토리와 같도록 동기화 시켜준다.

empty 라는 비어있는 디렉토리를 만들어 test 디렉토리에 동기화 시켜 test 디렉토리를 empty 디렉토리에 동기화 시키는 방법인데
time 명령어를 사용해서 명령어 실행시간을 측정해봤는데 대략 0.01초가 걸렸다.
시간으로도 확인할 수 있지만 첫 번째 방법을 사용했을 때보다 체감상 빠르다는 느낌이 들긴 한다.

 

 jaynam@MacBook-Pro  ~/workspace/rm_script  time rsync -avh --delete empty/ test/
building file list ... done
deleting 999
deleting 998
deleting 997
deleting 996
deleting 995
deleting 994
deleting 993
deleting 992
deleting 991
deleting 990
deleting 99
(...snip...)
deleting 100
deleting 10
deleting 1
./

sent 79 bytes  received 26 bytes  210.00 bytes/sec
total size is 0  speedup is 0.00
rsync -avh --delete empty/ test/  0.01s user 0.07s system 120% cpu 0.063 total

 

1000개 정도의 파일을 가지고 간단한 테스트를 해봤는데 사실 단순하게 rm 명령어만 사용하는 게 가장 빨랐다.ㅎㅎ
하지만 각 시스템 별, 서비스 별 고려해야 할 부분이 반드시 있을 것이고 하나의 디렉토리가 아닌 여러 디렉토리의 파일들을 같이 삭제해야 하는 경우도 있을 것이다. 그리고 테스트를 하는 과정에서 1000개의 파일을 가지고 테스트를 해봤지만 실제로는 10만, 100만 개의 파일들을 지워야하는 경우도 있다.
그렇기 때문에 대량의 파일을 삭제하는 방법 중에 rsync 라는 명령어를 사용해서 삭제하는 방법도 있다는 것을 알아두면 좋을 것 같아 이렇게 정리해봤다. 마지막으로 파일을 삭제하는 과정은 매우 조심스러운 과정이기 때문에 삭제하기 전 많은 부분을 천천히 확인하고 진행하는 게 좋지 않을까 생각한다.

 

추가)

rsync 를 사용할 때 정확한 경로를 설정해주어야 한다.
특정 디렉토리안의 모든 디렉토리들을 검색할 때 * 문자를 사용해서 모든 디렉토리를 불러오기도 하는데
rsync 명령어를 사용하려고 할 때 정확한 경로를 통해 디렉토리를 설정하지 않으면 원하는 결과를 얻기 힘들다.
따라서 특정 디렉토리에 대해 동기화하거나 rsync 명령어를 사용하기에 적합한 지에 대해서 먼저 생각하고 사용해야할 것 같다.

rsync 를 사용해서 두 디렉토리를 동기화 시키게 되면 동기화 하고자 하는 파일의 권한 또한 따라가게 된다.
따라서 동기화할 두 디렉토리의 권한에 문제가 없는지 그리고 권한이 바뀌어도 괜찮은 지 확인하고 사용해야 한다.

728x90
반응형
복사했습니다!