기술 · 실용 가이드
Linux에서 파일 히스토리의 최신 버전만 모으는 방법
Linux에서 읽을 수 있는 Windows 파일 히스토리 폴더의 최신 버전만 별도로 복사하세요. 파일명에 저장된 UTC 타임스탬프로 버전을 고르고, 서로 다른 파일은 구분해 유지합니다.

Windows 파일 히스토리 폴더에는 같은 문서의 저장본이 여러 개 있을 수 있으며, 각 파일명에는 UTC 타임스탬프가 붙어 있습니다. 파일마다 가장 최근 저장본을 남기려면 원래 디렉터리와 전체 파일명을 기준으로 버전들을 묶은 뒤, 파일명에 저장된 타임스탬프를 비교해야 합니다. Linux가 파일을 나열하는 순서로 이를 대신 판단해서는 안 됩니다.
아래 도구는 최신 버전만 담은 별도의 사본을 만듭니다. 원본 파일을 다시 쓰거나 삭제하지 않으며, 기본 동작인 미리보기에서는 출력 파일을 만들지 않습니다. 선택 결과를 적용하면 선택한 파일이 새 출력 디렉터리에 복사됩니다. 백업에서 이전 버전을 삭제하거나 그 버전들이 차지하는 공간을 확보하는 작업은 하지 않습니다.
실제로 가지고 있는 파일 확인하기
저장된 파일 자체가 들어 있고 읽을 수 있는 폴더에서 시작하세요. 지원되는 파일명의 예는 Report (2024_05_03 09_30_00 UTC).docx입니다. 같은 디렉터리에 더 나중의 저장본인 Report (2024_05_08 16_15_00 UTC).docx가 있다면 같은 그룹에 속합니다. 도구에는 처리하려는 하위 디렉터리 트리의 경로를 지정하세요. FileHistory라는 이름의 모든 폴더에서 이런 파일명 형식을 볼 수 있다고 가정해서는 안 됩니다.
원본 백업은 온전히 보관하세요. 큰 디렉터리 트리를 처리하기 전에 파일 몇 개를 살펴보고 정상적으로 열리는지 확인하세요. 디스크를 마운트할 수 없거나 파일을 읽을 수 없거나 파일명이 의미를 알 수 없는 식별자로 되어 있다면, 이 도구를 다음 복구 단계로 사용하면 안 됩니다. 이 도구는 파일 히스토리 카탈로그에서 원래 경로를 재구성하거나 누락된 파일 내용을 복구할 수 없습니다.
이름이 비슷하다는 이유만으로 서로 다른 사용자나 컴퓨터의 백업을 한 폴더에 합치지 마세요. 읽을 수 있는 백업 중 처리하려는 하위 트리를 선택하고 디렉터리 구조를 유지하세요. 다른 백업은 별도로 처리하세요. 서로 다른 백업에 있는 이름이 같은 문서 두 개가 동일한 원본 파일이라는 근거는 이 과정에서 확인되지 않습니다.
어떤 버전이 선택되는지 이해하기
같은 디렉터리 안에서 도구는 원래의 전체 파일명이 같은 버전들에 붙은 UTC 타임스탬프를 해석해 비교합니다. Report.docx와 Report.pdf는 별도 그룹입니다. Documents/Report.docx와 Archive/Report.docx도 별도 그룹입니다. 확장자와 디렉터리도 파일을 구분하는 기준에 포함됩니다.
다른 디스크로 파일을 복사하면 파일시스템의 타임스탬프가 바뀔 수 있습니다. 그런 타임스탬프는 선택 결과를 결정하지 않습니다. 디렉터리를 탐색할 때 우연히 마지막에 나타난 버전을 선택하는 것도 아닙니다. Python 문서는 디렉터리 순회 목록이 반드시 정렬되어 있는 것은 아니라고 설명합니다. 선택하려는 것은 지원되는 각 그룹에 실제로 존재하는 저장된 UTC 값 중 가장 큰 값입니다.
도구를 다운로드하고 경로 정하기
Linux에서 터미널을 열고 Python 버전을 확인하세요:
python3 --version
Python 3.10 이상을 사용하세요. filehistory-latest-v1.py를 작업 폴더에 저장한 다음, 그 폴더에서 터미널을 여세요. curl이 설치되어 있다면 다음 명령으로 소스 파일을 다운로드할 수 있습니다. 이 명령은 스크립트를 저장하며, 실행하지는 않습니다.
curl --fail --location "https://watchatease.com/guide-tools/filehistory-latest-v1.py" --output "filehistory-latest-v1.py"
아래 예시에서 FileHistory-copy/Documents는 원본 하위 트리이고, latest-documents는 FileHistory-copy와 같은 상위 디렉터리에 새로 만들 출력 폴더입니다. 원본 경로를 실제 경로로 바꾸세요. 공백이 있는 경로는 따옴표로 감싸세요. 출력 디렉터리는 아직 존재하지 않아야 하며, 원본과 출력 경로가 서로 겹쳐서는 안 됩니다. 출력을 원본 안에 두지 마세요.
복사하기 전에 선택 결과 미리 보기
이 원본 하위 트리에 파일을 쓰는 백업 작업을 일시 중지하고, 미리보기부터 복사가 끝날 때까지 원본 파일을 변경하지 마세요. 이 과정은 모든 파일을 한 시점에 포착하는 작업이 아닙니다. 먼저 --apply 없이 명령을 실행하세요:
python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents"
도구는 출력 디렉터리를 만들지 않고 터미널에 JSON 미리보기를 표시합니다. 파일 내용을 읽거나 해시를 계산하지 않으므로, 미리보기가 성공해도 나중에 모든 파일을 복사할 수 있다고 보장되지는 않습니다. 계속하기 전에 경로와 선택 정보를 읽어 보세요. 여러 저장 버전이 있는 익숙한 파일 하나, 확장자만 다르고 기본 이름은 같은 파일 두 개, 서로 다른 디렉터리에 있는 이름이 같은 파일을 확인하세요.
지원하는 타임스탬프 형식과 일치하지 않는 일반 파일은 건너뛴 항목으로 보고됩니다. 이런 파일은 최신 버전만 담은 결과에 복사되지 않습니다. 건너뛴 파일도 중요할 수 있으므로 해당 항목을 확인하고 필요에 따라 별도로 보관하거나 복사하세요. 이 결과를 원본 아래에 있는 모든 파일의 사본으로 여겨서는 안 됩니다.
유효하지 않은 UTC 타임스탬프, 심볼릭 링크, 특수 파일 또는 읽기 실패가 있으면 실행이 중단됩니다. 가장 최근 타임스탬프가 같아 어느 파일을 골라야 할지 모호한 경우에도 검토가 필요합니다. 검사를 통과시키려고 익숙하지 않은 날짜를 고치거나 동률인 파일 중 하나를 임의로 고르지 말고, 보고된 경로를 확인하세요. 지원되는 파일이 하나도 없어도 실행이 차단됩니다. 타임스탬프가 붙은 파일들이 들어 있는 데이터 하위 트리를 선택했는지 확인하세요.
최신 버전을 새 디렉터리에 복사하기
미리보기가 모으려는 파일을 올바르게 보여 준다면 같은 명령에 --apply를 붙여 다시 실행하세요:
python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents" --apply
출력에는 files 디렉터리, manifest.csv, summary.json이 들어 있습니다. 선택된 파일은 상대 디렉터리 구조를 유지합니다. 기본적으로 저장 시의 타임스탬프가 붙은 파일명도 유지하므로 어떤 버전이 선택되었는지 알 수 있습니다. 원본 백업에는 이전 버전들이 그대로 남아 있습니다. 도구가 복사하는 것은 파일 내용이며, 원래 권한, ACL 또는 파일시스템 타임스탬프는 복사하지 않습니다.
결과에서 원래 파일명을 쓰고 싶다면 --restore-names를 추가하세요. 이 옵션은 이름을 편하게 바꾸는 기능이며, 어느 타임스탬프가 선택되는지는 바꾸지 않습니다. 적용하기 전에 아직 사용하지 않은 다른 출력 경로로 이 옵션의 결과를 미리 확인하세요:
python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents-original-names" --restore-names
python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents-original-names" --restore-names --apply
결과를 사용하기 전에 확인하기
summary.json을 읽고 텍스트 편집기나 스프레드시트 뷰어로 manifest.csv를 살펴보세요. 복사가 완료된 결과는 status가 complete이고 _INCOMPLETE.txt 표시 파일이 없습니다. 매니페스트에서 source_relative_path와 output_relative_path로 각 복사 파일의 출처와 출력 위치를 추적하고, version_utc로 선택된 날짜를 확인하며, sha256으로 기록된 내용 해시를 확인하세요. copied, older_version, unmatched 항목을 합계 및 보고된 오류와 대조하세요.
도구는 SHA-256 해시로 복사된 파일 내용을 검사합니다. 해시가 일치하면 복사한 바이트가 선택된 원본 파일과 같다는 근거가 됩니다. 하지만 선택된 파일이 완전하고 손상되지 않은 원본이었다거나, 기대한 모든 문서가 백업에 들어 있었다는 것까지 입증하지는 않습니다.
출력된 문서, 이미지 또는 다른 파일 몇 개를 평소 사용하는 프로그램에서 열어 보세요. 중요한 파일, 여러 버전이 있었던 파일, 서로 다른 디렉터리의 파일을 포함하세요. 내용을 알고 있는 그룹 하나를 골라 선택된 타임스탬프를 원본에 있는 버전들과 비교하세요. 빠진 내용이나 예상과 다른 점이 있다면, 결과가 완전하다고 판단하기 전에 미리보기와 원본 파일을 다시 확인하세요.
목적이 디스크 공간 확보였다면, 이 과정이 원본 백업을 정리하지 않았다는 점을 기억하세요. 먼저 최신 버전만 담은 사본을 검증한 뒤, 백업과 그 안의 이전 버전을 계속 보관할지 별도로 결정하세요. 이전 버전은 나중에 도움이 될 수 있습니다. 새 폴더가 만들어졌다는 이유만으로 삭제하지 마세요.
명령이 완료되지 않는 경우
Python이 스크립트를 찾지 못하면 터미널의 현재 폴더를 확인하거나 스크립트의 전체 경로를 지정하세요. 원본을 찾지 못하면 읽을 수 있는 백업이 실제로 마운트된 위치를 사용하세요. Windows의 드라이브 문자가 Linux에서도 자동으로 사용할 수 있는 경로가 되는 것은 아닙니다.
출력이 이미 있다면 아직 사용하지 않은 다른 출력 디렉터리를 선택하세요. 파일이 들어 있는 결과 디렉터리를 다음 실행의 대상으로 지정하고 업데이트나 병합을 기대하지 마세요. 적용할 때는 미리보기에서 사용한 옵션을 그대로 유지하세요. --restore-names를 선택했다면 그것도 포함해야 합니다. 이름을 복원했을 때 파일과 디렉터리의 경로가 충돌한다면 해당 구조를 검토하거나, 기본값인 타임스탬프가 붙은 출력 파일명을 사용하세요.
미리보기나 사전 검사에 실패하면 출력 디렉터리를 만들지 않고 오류를 반환합니다. 복사 도중 실패하면 _INCOMPLETE.txt 및 failed 또는 in_progress 상태의 summary와 함께 일부 출력이 남을 수 있습니다. 보고서 파일을 쓰는 작업도 실패하면 summary.json이나 manifest.csv가 없을 수 있습니다. 터미널 오류, 미완료 표시 파일 또는 완료를 확인할 근거의 누락 중 하나라도 있으면 성공하지 못한 실행으로 판단하세요. 보고된 원인을 해결하고 다시 미리보기를 한 뒤, 또 다른 새 출력 디렉터리에 적용하세요.
문제를 조사하는 동안 미완료 디렉터리는 따로 보관하세요. 도구가 자동으로 지우지는 않습니다. 그 안의 파일을 나중 실행 결과와 섞은 뒤 전체가 검증되었다고 해서는 안 됩니다. 완료된 실행 한 번에 해당하는 매니페스트와 요약을 사용하고, 무엇을 보관할지 결정하기 전에 그 파일들을 열어 확인하세요.
최신 버전 모음만으로는 알 수 없는 것
각 그룹에서는 사용 가능한 저장본 중 가장 최근 버전 하나를 가져오며, 이 버전들은 서로 다른 날짜의 것일 수 있습니다. 따라서 이 모음은 어느 특정 시점의 컴퓨터 상태를 담은 스냅샷이 아닙니다. 원래 컴퓨터에서 삭제된 파일도 백업에 저장본이 남아 있다면 이 결과에 포함될 수 있습니다.
누락된 이전 버전, 지원 형식과 일치하지 않는 파일명, 카탈로그에만 있는 정보, 의미를 알 수 없는 저장 경로는 이 선택 과정의 대상이 아닙니다. 도구는 삭제 이력을 추론하거나 그런 경로를 재구성하거나 인식하지 못한 파일을 버려도 된다고 판단하지 않습니다.
Windows를 사용할 수 있고 파일 히스토리의 날짜별 복원이 필요하다면 Microsoft가 안내하는 기본 복원 절차를 이용할 수 있습니다. 다른 기존 방법으로는 WindowsFileHistoryCleaner가 이미 최신 버전 선택과 미리보기 모드를 제공합니다. Mono는 폭넓은 .NET 기능을 지원하지만, 이 가이드는 그 특정 프로젝트의 Linux 설정을 검증했다고 주장하지 않습니다. 여기서 다루는 작업 흐름은 위에서 설명한, 읽을 수 있고 타임스탬프가 붙은 파일로 범위를 한정합니다.
