본문 바로가기
책상 노트 책상 노트
실무자가 실제로 굴려본 업무도구·업무 자동화 기록

검증된 중복 파일도 지우지 않고 옮기기로 한 이유

읽는 시간 약 9분

드라이브 7개를 정리했던 이전 작업에서는 검증된 중복을 확인 즉시 지웠습니다. 이번에는 대상이 회사 공유폴더, 아카이브 드라이브, 외장 백업 세 곳이었고, 방식을 바꿨습니다. 중복이 확인된 파일도 지우지 않고 옮겼습니다. 공유폴더는 지금도 사람들이 매일 여는 곳이고, 아카이브와 외장 백업에는 “혹시 몰라서” 남겨둔 자료가 훨씬 많았습니다. 지난 작업의 대상이 종료된 창고 드라이브였다면, 이번 대상은 지금도 쓰는 자료였습니다. 이 차이가 삭제와 이동을 가르는 기준이 됐습니다.

시작 전에 세 곳을 먼저 세어봤습니다. 공유폴더는 현재 진행 중인 작업이 들어 있는 곳이라 파일 수가 많지 않은데도 용량이 컸고, 아카이브 드라이브에는 종료된 현장과 지난 연도 자료가 쌓여 있었습니다. 외장 백업은 반기마다 통째로 복사한 결과물이라 파일 수와 용량 모두 나머지 둘을 합친 것과 비슷한 규모였습니다. 아카이브 드라이브에는 같은 현장 폴더가 “현장명”, “현장명_백업”, “현장명(1)” 세 벌로 들어 있는 곳이 여럿이었고, 이 시점에는 어느 벌이 최신인지조차 폴더 이름만으로는 알 수 없었습니다.

이름이 아니라 내용으로 찾은 중복

처음에는 파일명과 크기가 같은 것을 중복으로 잡으려 했습니다. 엑셀에서도 할 수 있는 수준이라 만만하게 봤는데, 하루 만에 접었습니다. 이름이 같고 크기가 같은데 내용이 다른 견적서 파일이 있었습니다. 견적서를 고쳐서 같은 이름으로 다시 저장하면 크기가 몇 바이트 차이도 안 나는 경우가 흔했고, 이걸 중복으로 지우면 한쪽 버전이 통째로 사라집니다. 반대로 이름은 전혀 다른데 내용이 완전히 같은 도면 파일도 훨씬 많았습니다. “도면.pdf”와 “도면(1).pdf”와 날짜가 붙은 파일명이 바이트 단위로 완전히 같은 경우였습니다. 이름으로는 둘 다 못 잡습니다.

그래서 내용 기준으로 갔습니다. 파일 하나하나의 해시값을 구해서 값이 같으면 같은 파일로 보는 방식입니다. 이름이나 위치와 무관하게 내용이 같은지만 봅니다. 세 곳을 합치면 계산 대상이 상당히 많아서, 크기가 같은 파일끼리만 해시를 구하도록 걸러 계산량을 크게 줄였습니다. 크기가 다른 파일은 애초에 같은 파일일 수 없으니 해시를 구할 필요가 없습니다.

계산 과정에서 걸린 것도 몇 가지 있었습니다. 현장 폴더 안이 여러 겹으로 파여 있어 전체 경로가 260자를 넘는 파일에서 스크립트가 한 번 멈췄습니다. 윈도우에서는 이 길이를 넘으면 파일을 못 여는데, 경로 앞에 특수 접두어를 붙여서 우회하는 방법이 있어 그렇게 고쳤습니다. 다른 한 번은 누군가 사용 중인 엑셀 파일에서 멈췄습니다. 잠긴 파일은 건너뛰고 목록에만 적어두는 것으로 바꿨습니다. 외장 드라이브 쪽은 유독 느려서 밤새 돌려도 안 끝나 다음 날 아침에 보니 절반 정도만 진행돼 있었습니다. 알고 보니 USB 2.0 포트에 물려 있었고, 포트를 바꾸고 나서야 남은 절반이 몇 시간 만에 끝났습니다.

이렇게 걸러낸 결과, 세 곳에 걸쳐 내용이 완전히 같은 파일이 여러 벌씩 존재하는 사례가 상당한 규모로 나왔습니다. 외장 백업 안에서만 겹치는 경우가 절반을 넘었고, 공유폴더와 아카이브 사이에서 겹치는 경우는 상대적으로 적었습니다.

해시를 다 구하고 나서 처음 든 생각은 “이걸 왜 진작 안 했나”였습니다. 그런데 다시 생각해보면 진작 하지 않은 이유가 있었습니다. 파일 100만 개 단위를 사람이 눈으로 훑어서 중복을 찾는 건 애초에 불가능하고, 스크립트를 돌리는 것도 크기 선필터 없이는 시간이 감당이 안 되는 작업이었습니다. 크기 선필터라는 아이디어 자체가, 이전에 드라이브 7개를 정리하면서 겪은 시행착오에서 나온 것이었습니다. 그때는 후보군을 줄이지 않고 전체에 해시를 걸어 하루 넘게 걸렸던 경험이 있었고, 이번에는 그 경험을 그대로 가져와 처음부터 크기로 좁힌 뒤에 해시를 걸었습니다. 같은 방식을 다른 대상에 다시 쓸 때 걸리는 시간이 확 줄어드는 걸 여기서 체감했습니다.

이름과 크기 비교에서 해시 비교로 바뀐 중복 탐지 방식을 단계로 정리한 도해

해시가 정해주지 않는 것

여기서부터가 이번 작업의 핵심입니다. 해시가 같으면 내용이 같다는 건 확실하고, 같은 내용이 세 벌 있을 이유는 없습니다. 그런데도 곧바로 지우지 못한 이유가 두 가지 있었습니다.

어느 벌을 남기고 어느 벌을 지울지는 해시가 정해주지 않습니다. 공유폴더의 것을 남기는 게 보통은 맞지만, 아카이브 쪽 폴더 구조가 더 정리돼 있어서 그쪽을 남기는 게 나은 경우도 섞여 있었습니다. 이 판단을 대상 전체에 자동으로 맞게 걸 자신이 없었습니다. 게다가 지운 뒤에 “그 파일 어디 갔어요”라는 요청이 오면 되돌릴 방법이 없습니다. 삭제는 한 번 틀리면 끝이고, 저는 이 방식을 처음 대량으로 돌리는 사람이었습니다.

그래서 중복분을 지우는 대신 “_중복이관” 폴더로 옮겼습니다. 원래 경로를 그대로 유지한 채 옮겨서 어디에 있던 파일인지 폴더 구조만 보고도 알 수 있게 했습니다. 옮기고 나서 석 달 동안 아무도 찾지 않으면 그때 지우기로 정했고, 지금 두 달째입니다. 그사이 파일을 찾는 요청이 세 번 있었고, 셋 다 이관 폴더에서 바로 꺼내줬습니다. 지웠다면 셋 다 찾던 자리에서 파일이 사라졌을 겁니다.

옮길 때 남길 한 벌을 고르는 규칙은 단순하게 정했습니다. 공유폴더에 있으면 공유폴더 것을 남기고, 없으면 아카이브의 정식 현장 폴더 것을 남기고, “_백업”이나 “(1)”이 붙은 폴더의 것은 무조건 이관 대상으로 뒀습니다. 규칙을 검토하는 동안 예외가 두 가지 나왔습니다. 하나는 공유폴더에 있는 파일이 아카이브의 것보다 수정 시각이 더 오래된 경우입니다. 해시가 같으니 내용은 같은데, 누군가 아카이브에서 공유폴더로 다시 복사하면서 시각이 갱신된 경우로 보였습니다. 이 경우만 시각이 오래된 쪽을 원본으로 보고 남기는 것으로 규칙에 추가했습니다. 다른 하나는 바로가기 파일이었습니다. 바로가기는 크기가 작아서 해시가 겹치는 경우가 흔했는데, 이걸 중복으로 옮기면 바로가기가 가리키던 폴더를 사람들이 못 찾게 됩니다. 내용은 같아도 위치 자체가 기능인 파일이 있다는 걸 여기서 다시 확인했고, 바로가기는 대상에서 뺐습니다.

중복 파일을 옮기고 보관하며 나온 숫자를 정리한 도해

옮긴 뒤 나온 0바이트 여섯 개

이동은 하루에 끝나지 않았습니다. 대상을 한 번에 옮기다가 중간에 멈추면 어디까지 됐는지 알 수 없을 것 같아서 현장 폴더 단위로 나눠서 돌렸습니다. 한 폴더를 옮기고, 그 폴더의 이관 목록을 남기고, 다음 폴더로 넘어가는 식이었습니다. 여러 저녁에 걸쳐 돌렸고, 실제 옮기는 시간보다 남길 벌을 고르는 규칙을 검토하는 시간이 더 길었습니다.

이동이 끝난 뒤 한 번 더 검증했습니다. 남긴 파일과 이관한 파일의 해시를 다시 구해서, 이관 폴더의 모든 파일이 남긴 쪽 어딘가에 같은 해시로 존재하는지 확인하는 작업입니다. 이관한 파일 중에 짝이 없는 파일이 있으면 그건 중복이 아닌데 옮겨진 것이니 되돌려야 합니다.

결과는 짝이 없는 파일 0건이었습니다. 다만 검증 과정에서 다른 문제가 하나 나왔습니다. 이동 중에 외장 드라이브가 한 번 끊겼는데, 그때 옮기던 파일 여섯 개가 목적지에 0바이트로 남아 있었습니다. 목적지에 파일 이름이 있는지만 봤다면 정상 이관으로 지나쳤을 자리입니다. 해시 재검증에서 원본과 값이 다른 0바이트 파일이 걸리면서 발견됐습니다. 원본이 아직 원래 자리에 남아 있어서 다시 옮겼고, 이 일 뒤로는 옮기는 동작을 복사, 해시 대조, 원본 삭제의 세 단계로 나눠서 돌리는 것으로 바꿨습니다. 검증을 건너뛰었다면 이 여섯 개는 조용히 사라졌을 파일입니다.

정리 전 백업 습관과 지금의 백업 방식을 좌우로 비교한 도해

바뀐 건 습관 쪽입니다

정리를 마치고 나서 남은 질문은 하나였습니다. 반년 뒤에 이 작업을 또 하게 될 것인가입니다. 답은 습관을 그대로 두면 그렇다는 것이었습니다. 현장 폴더를 정리하기 전에 통째로 복사해두고, 연말에 아카이브로 옮기면서 원본은 혹시 몰라 남겨두고, 외장 드라이브에는 반기마다 전체를 다시 복사하는 세 단계 어디에도 지우는 동작이 없었습니다. 파일은 계속 늘기만 하는 구조였습니다.

그래서 폴더째 복사해두는 백업 방식을 접었습니다. 지금은 바뀐 부분만 옮기는 방식으로 돌리고, 외장 백업은 이전 반기분을 지우는 방식으로 바꿨습니다. 처음에는 이 변경이 불안했습니다. 통째로 복사해두는 쪽이 뭔가 하나라도 놓칠 위험이 적어 보였기 때문입니다. 그런데 이번 정리에서 확인한 바로는, 통째로 복사해두는 습관이 놓치는 걸 막아준 적은 없고 그저 같은 파일을 세 벌 네 벌로 늘려놓기만 했습니다. 놓치지 않으려면 복사본을 늘릴 게 아니라 해시로 검증하고 넘어가는 절차가 있으면 됩니다.

작업 자체보다 이 습관을 확인한 게 더 오래 남을 결과라고 생각합니다. 중복을 한 번 치운다고 끝나는 일이 아니고, 중복이 왜 계속 생기는지를 봐야 다음 정리를 안 하게 됩니다. 이번에 옮긴 이관 폴더를 석 달 뒤에 비우려고 열어 보면 새로 생긴 중복이 아니라 이번에 미뤄둔 판단의 결과물만 남아 있을 것 같습니다. 지운 것보다 옮긴 것이 많았던 이번 작업이, 다음번에는 옮길 것도 거의 없는 작업으로 이어지길 바라고 있습니다.

책상 노트 운영자
함께 보면 좋은 글
error: Content is protected !!