한글 파일명 자소분리: 윈도우에서 파일을 찾을 수 없을 때
파일 탐색기에서는 파일이 분명히 보입니다. 더블클릭하면 열리기도 합니다. 그런데 그 파일명을 명령어나 스크립트, 엑셀 하이퍼링크, 배치 작업, 주소창에 직접 입력하는 순간 윈도우는 "지정된 파일을 찾을 수 없습니다"라고 답합니다. 파일이 맥에서 만들어졌고 이름에 한글이 들어 있다면, 원인은 거의 예외 없이 한글 파일명 자소분리입니다. macOS는 파일명을 자음과 모음이 풀어진 형태(NFD)로 저장하는 경우가 많고, 윈도우에서 키보드로 입력하는 글자는 완성형으로 합쳐진 형태(NFC)입니다. 화면에서는 똑같아 보여도(어떤 프로그램에서는 ㅎㅏㄴㄱㅡㄹ처럼 풀어져 보이기도 합니다) 실제로는 서로 다른 문자 열이라서 윈도우는 같은 이름으로 보지 않습니다. 해결 방법은 파일명을 합쳐진 형태로 바꿔주는 것이고, PowerShell 명령어 한 줄로도 되고 브라우저에서 드래그 앤 드롭으로도 됩니다. 이 글에서 두 가지를 모두 다룹니다.
맥과 윈도우 사이에서 한글 파일명 자소분리가 생기는 이유
유니코드에는 같은 글자를 적는 방법이 둘 있습니다. 한이라는 글자는 하나의 코드(완성형, NFC)로 저장될 수도 있고, ㅎ + ㅏ + ㄴ처럼 자음과 모음 세 개를 이어 붙인 형태(조합형, NFD)로 저장될 수도 있습니다. 대부분의 화면은 둘 다 "한"으로 그려줍니다. 사람 눈으로는 구분이 안 됩니다.
파일 시스템은 구분합니다. 윈도우(NTFS)는 파일명을 실제 문자 순서로 비교합니다. 영문 대소문자 차이는 무시하지만 한과 ㅎ+ㅏ+ㄴ은 다른 이름으로 취급합니다. 그래서 맥에서 만든 계약서_김민수.pdf가 실제로는 ㄱ+ㅖ+ㅇ+ㅑ+ㄱ+ㅅ+ㅓ_...로 저장되어 있는데 윈도우 키보드로 계약서_김민수.pdf를 입력하면, 그 디스크에 존재하지 않는 이름을 찾아달라고 하는 셈이 됩니다.
macOS는 오래전부터 조합형을 선호해 왔습니다. 예전 파일 시스템인 HFS+는 모든 파일명을 NFD로 바꿔 저장했고, 지금도 상당수의 맥 앱과 복사 도구가 NFD 이름을 만들어 냅니다. 그 파일이 USB, 외장하드, NAS, 클라우드 동기화 폴더, 메일 첨부, 카카오톡 첨부를 통해 윈도우로 건너가면 풀어진 이름이 그대로 따라옵니다.
영향을 받는 글자:
- 한글 전체. 받침 유무와 관계없이 음절마다 자음과 모음으로 풀립니다(한글 → ㅎㅏㄴㄱㅡㄹ).
- 일본어 탁점·반탁점이 붙은 가나(が → か + ゛)
- 악센트가 붙은 알파벳(é → e + ◌́, Müller, café)
- 베트남어처럼 모음 하나에 기호가 여러 개 올라가는 글자
순수 영문·숫자 이름(report_final_v2.pdf)은 절대 영향을 받지 않습니다. 그래서 이 문제는 무작위처럼 보입니다. 같은 폴더에서 맥 쓰는 동료가 보낸 한글 이름 파일만 말썽을 부리는 이유가 이것입니다.
정말 자소분리 문제인지 확인하는 방법
이름을 바꾸기 전에, 오타나 끝에 붙은 공백, 엉뚱한 폴더 때문이 아니라 정말 자소분리가 원인인지 확인합니다. 빠른 검사 세 가지입니다.
1. 와일드카드로 찾아보기
해당 폴더를 PowerShell로 엽니다(폴더 빈 곳에서 마우스 오른쪽 클릭 → 터미널에서 열기 또는 여기에 PowerShell 창 열기). 한글 부분은 피하고 영문·숫자·확장자만으로 검색합니다.
Get-ChildItem *_v2.hwp
와일드카드로는 파일이 잡히는데 전체 이름을 직접 입력하면 안 잡힌다면, 이름 안에 내가 입력한 것과 다른 문자가 들어 있다는 뜻입니다. 자소분리의 전형적인 증상입니다.
2. 글자 수 비교하기
같은 폴더에서 실행합니다.
Get-ChildItem | ForEach-Object { "$($_.Name.Length) $($_.Name)" }
한글.pdf는 6글자여야 합니다. PowerShell이 10이라고 보여주면 "한"과 "글"이 각각 자음·모음 세 개로 풀려 있는 것입니다. 한글 한 음절이 2~3글자로 세어지면 조합형이라고 보면 됩니다.
3. PowerShell에 직접 물어보기
Get-ChildItem | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Select-Object Name
폴더 안에서 완성형(NFC)이 아닌 이름을 가진 파일을 전부 보여줍니다. 문제의 파일이 여기 나오면 원인은 확정입니다.
명령어를 입력한 적이 없어도 윈도우에서 같은 문제가 나타나는 곳이 있습니다.
- 맥 쓰는 동료가 만든 엑셀·워드 하이퍼링크가 그쪽에서는 열리는데 내 PC에서는 "지정한 파일을 열 수 없습니다"가 뜨는 경우
- 파일명 목록으로 돌아가는 배치 스크립트, 백업 작업, 그룹웨어 일괄 등록 도구
- "다른 이름으로 저장"을 눌렀을 때 덮어쓸지 묻지 않고
계약서.pdf가 하나 더 생기는 경우 - 일부 프로그램에서 정확한 이름으로 검색하면 안 나오는데, 한글 부분을 빼고 검색하면 나오는 경우
- 맥에서 압축한 zip을 윈도우에서 풀었더니 폴더와 파일 이름이 ㅎㅏㄴㄱㅡㄹ처럼 풀려 나오는 경우
해결 1: 윈도우 PowerShell로 파일명 바꾸기
명령어가 익숙하다면 윈도우에 이미 필요한 도구가 다 있습니다. .NET의 Normalize('FormC')가 조합형 이름을 완성형으로 바꿔주고, Rename-Item이 그 이름을 적용합니다.
-
위에서 설명한 방법으로 해당 폴더를 PowerShell에서 엽니다.
-
먼저 무엇이 바뀔지 미리 봅니다(아직 아무것도 바뀌지 않습니다).
Get-ChildItem -Recurse -File | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Select-Object FullName -
목록이 맞다면 이름을 바꿉니다.
Get-ChildItem -Recurse -File | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Rename-Item -NewName { $_.Name.Normalize('FormC') } -
앞 단락의
-ne검사를 다시 실행합니다. 이제 아무것도 나오지 않아야 합니다.
참고와 한계:
-Recurse는 하위 폴더까지 들어갑니다. 현재 폴더만 처리하려면 빼세요. 폴더 이름 자체도 풀려 있을 수 있으니,-File을 빼고 한 번 더 실행해서 가장 깊은 폴더부터 바꿔줍니다.- 이 명령은 내 쪽 사본의 이름을 바꿉니다. 파일이 OneDrive, Dropbox, Google Drive 같은 동기화 폴더에 있으면 바뀐 이름이 맥 쪽에도 반영됩니다. 완성형 이름은 양쪽에서 다 잘 동작하므로 보통은 그게 원하는 결과입니다.
- 맥에서 복사해 온 풀어진 이름을 그대로 참조하던 하이퍼링크나 스크립트가 있다면 이제 존재하지 않는 이름을 가리키게 됩니다. 실제로는 드문 경우인데, 애초에 문제가 "사람은 완성형으로 입력한다"는 데서 시작하기 때문입니다.
해결 2: 명령어 없이 브라우저에서 바꾸기
PowerShell이 부담스럽거나, 여러 사람에게서 받은 파일과 zip 압축파일이 뒤섞여 있다면 무료인 FilenameFixer 웹앱이 같은 변환을 드래그 앤 드롭으로 해줍니다.
- Chrome, Edge, Firefox, Safari 중 아무 브라우저에서 웹앱을 엽니다.
- 문제가 되는 파일을 페이지 위로 끌어다 놓습니다. 여러 개를 한 번에 넣어도 됩니다.
- 도구가 조합형 이름을 찾아내고, 적용할 완성형(NFC) 이름을 보여줍니다.
- 이름이 바뀐 파일을 내려받아 원본과 바꿔 넣습니다.
알아두면 좋은 점:
- 파일과 파일명은 브라우저 안에서 로컬로 처리되고 서버로 업로드되지 않습니다.
계약서_김민수.pdf같은 대외비 문서도 내 PC 밖으로 나가지 않습니다. - 맥에서 보낸 zip 안의 이름이 풀려 있다면, 별도의 ZIP 파일명 복원 도구가 압축을 풀지 않은 채로 압축파일 안쪽의 이름을 고쳐 줍니다(200 MB까지). 그 뒤 윈도우에서 평소처럼 압축을 풀면 됩니다.
- 붙여넣은 텍스트를 변환하는 입력창도 있습니다. 동료가 메일이나 스프레드시트로 보낸 파일명 목록이 VLOOKUP 같은 수식에서 디스크의 파일과 매칭되지 않을 때, 목록을 붙여넣고 완성형으로 바뀐 결과를 복사해 쓰면 됩니다.
FilenameFixer가 PowerShell이 못 하는 일을 하는 것은 아닙니다. 어떤 명령어를 써야 하는지 알 필요가 없고, 위의 Rename-Item 방식으로는 안 되는 압축파일 안쪽까지 처리해 준다는 점이 다를 뿐입니다.
다시 겪지 않으려면
이름을 바꾸면 오늘 받은 파일은 해결됩니다. 다음번을 줄이려면:
- 맥 쪽에 압축 시 파일명을 신경 써 달라고 하거나, 웹 양식을 거쳐 받으세요. 많은 웹 업로드 경로가 들어오는 이름을 정규화하지만, 전부 그런 것은 아닙니다.
- 맥에서 만든 파일을 웹사이트에 올린다면 Chrome 확장 프로그램을 쓰세요. FilenameFixer Chrome 확장 프로그램은 업로드 창에서 파일을 고를 때 이름을 자동으로 NFC로 바꿔 줍니다. 학교 과제 제출 사이트, 관공서 민원 사이트, 사내 그룹웨어나 전자결재 시스템이 처음부터 완성형 이름을 받게 됩니다.
- 공유하는 프로젝트 파일은 가능하면 영문·숫자 이름으로 두세요.
contract_kim.pdf는 이 문제를 아예 건드리지 않습니다. 보기엔 덜 친절하지만 스크립트, 하이퍼링크, 일괄 등록 목록에서 참조하는 파일이라면 가장 안전한 선택입니다. - 코드에서 정규화하세요. 디스크의 파일명을 읽어 사용자 입력과 비교하는 프로그램을 만든다면 비교 전에 양쪽을 NFC로 맞춥니다. 대부분의 언어에 한 줄짜리 함수가 있습니다(.NET은
.Normalize('FormC'), Python은unicodedata.normalize('NFC', s), JavaScript는str.normalize('NFC')).
이 문제는 윈도우 버그도 맥 버그도 아닙니다. 두 운영체제 모두 받은 바이트를 그대로 저장하고 있을 뿐입니다. 같은 글자의 유효한 표기법 두 가지가 한 디스크에서 만났기 때문에 생기는 어긋남이고, 가장 빨리 정리하는 방법은 완성형을 기준으로 정해 이름을 바꾸는 것입니다.