2015년부터 macOS(당시엔 OS X)를 주력으로 사용해 왔는데, 당시에는 가상머신이 있어도 윈도우 컴퓨터가 별도로 없으면 사무를 보기가 거의 불가능할 정도였다. 2020년인 지금은 가상머신 없이도 윈도우를 켤 일이 거의 없다시피 할 정도로 많이 발전했지만 여전히 문제가 되는 것 하나는 윈도우나 리눅스로 보낸 파일명의 자소분리 현상이다.

Fig. 자소분리 현상 (Source: https://skjo929.blog.me/222036684719)"

맥에서 파일명이 한글인 파일을 윈도우나 리눅스로 보내게 되면 윈도우와 리눅스는 유니코드 정규화 NFC 방식을 쓰고 맥은 NFD 방식을 사용하여 생기는 문제인데, 둘 다 인정되는 표준이므로 어느 한쪽의 잘못이라고 하긴 어렵지만 실질적으로 맥에서 보낸 한글명 파일들만 자소분리가 되므로 자연스레 맥의 문제라고 간주하게 되기 마련이다.

이러한 문제로 예전부터 특정 메신저, 메일 서비스, 클라우드 등을 이용하여 파일을 보내면 자동으로 NFC 변환이 되며 해결이 되는 경우를 찾아 사용하는 등 임시방편 수준의 해결법이 돌아다녔는데, 재현성이 충분하지 않아 믿을 것이 못 되었다. (본인도 삽질을 좀 했다 😅). 따라서 파일을 보낼 때 아예 NFC로 인코딩을 해준 후 보내는 것이 확실한 해결책이지만 OS X 시절 파일 시스템이 HFS였을 때는 파일 시스템 차원에서 NFD 정규화가 강제되었으므로 방법이 없었는데 2017년 APFS가 도입되어 유니코드 정규화를 하지 않게 됨으로써 NFC로 파일을 변환 후 보내는 것이 가능해졌다.

유니코드 정규화 방식 변환은 Björn Jacke라는 사람이 만든 convmv 라는 프로그램을 이용해 수행할 수 있다. 먼저 Homebrew를 통해 convmv를 설치한다.

brew install convmv

사실 이미 여러 다른 블로그에 convmv를 이용한 해결방법이 올라와 있는데, 대개 우클릭 - 서비스로 변환하는 방법을 쓴다. 변환은 잘 되나, 이 방법의 문제는 변환할 파일이 다른 한글명 파일들과 같은 폴더에 있어 NFC와 NFD가 혼재될 경우 파일명으로 정렬할 때 정렬이 꼬여 버리게 되는 것이다 (완성된 결과의 겉보기는 같으나 실제 글자를 구성하는 유니코드 문자는 각 방식이 다르기 때문이다). 따라서 별도의 폴더를 지정하여 윈도우/리눅스 쪽으로 보낼 파일을 복사해 넣으면, Folder Action을 통해 NFC로 자동 인코딩 후 결과를 보여주도록 하는 워크플로우를 작성했다.

먼저 convmv를 사용하여 특정 폴더 내 파일 전체를 NFC로 인코딩하는 커맨드는 다음과 같다.

convmv -r -f utf8 -t utf8 --nfc --notest {path/to/folder}

이를 특정 폴더에 들어가면 자동으로 실행되도록 하자. ‘/CONVMV’ 에 변환하고 싶은 파일을 넣으면 ‘/CONVMV/Converted to NFC’로 변환된 파일이 옮겨지고, 변환을 수행한 횟수를 알림으로 띄우도록 할 것이다.

Automator를 켜고 새 문서 - Folder Action을 선택한다.

Fig. Automator에서의 Folder Action 신규 작성

폴더를 선택해준 뒤, 아래와 같이 액션을 짜 주면 된다.

    1. Run Shell Script: convmv -r -f utf8 -t utf8 --nfc --notest ~/CONVMV/ | wc -l

위 convmv 명령어를 실행시킨다. 여기서는 run commands 설정을 자동으로 읽어들이지 않기 때문에 별도 설치한 프로그램을 실행하기 위해서 환경을 설정해줘야 하므로 export PATH=/usr/local/bin:$PATH 를 먼저 붙여주면 된다. convmv 커맨드 뒤에 들어가는 ‘| wc -l’ 은 convmv가 수행한 변환마다 출력되는 라인의 갯수를 세어 출력한다.

    1. Set Value of Variable

변환한 횟수를 알림으로 띄우기 위해 위에서 카운트한 ‘output’을 동명의 변수로 받는다.

    1. Run Shell Script: find . -maxdepth 1 -type f -exec mv {} ~/CONVMV/Converted\ to\ NFC \;

처리된 파일을 하위 폴더(~/CONVMV/Conveted to NFC)로 이동해주는 절차이다. ~/CONVMV 폴더로 먼저 이동하기 위해 cd ~/CONVMV/를 넣은 뒤, 위 명령어로 폴더를 제외하고 파일만을 찾아 하위 폴더로 이동시킨다. 이를 하지 않으면 변환되어 생성된 파일도 새로 폴더에 들어온 것으로 간주하기 때문에 의미 없는 재변환 시도가 일어난다.

    1. Display Notification

2번 액션에서 받은 output 변수를 활용하여 변환 횟수를 알림으로 띄운다.

Fig. CONVMV_to_NFC Folder Action

테스트를 위해 해당 폴더에 NFD 한글명 파일들을 넣는다.

Fig. 실험용 파일 투입

그리고 Automator로 돌아가 우측 상단에서 작성한 워크플로우를 실행한다.

Fig. Workflow completed!

Fig. 변환 성공 알림

실행이 잘 되었고, 1번 액션의 결과도 잘 출력되어 정상정으로 알림이 떴다. 이를 저장하고 실제로 폴더에 붙여 보자. 폴더 액션 스크립트의 저장은 디폴트로 ‘~/Library/Workflows/Applcations/Folder Actions’에 저장된다. 저장 후 액션을 붙일 폴더 우클릭 → Services → Folder Actions Setup… 에서 해당 폴더 액션을 적용하면 된다.

Fig. Folder Actions Setup

Fig. Folder Action 적용

이제 CONVMV 폴더로 파일을 붙여넣으면 알아서 변환을 수행 후 하위 폴더로 이동시켜 주게 된다. 이미 NFC인 파일을 넣게 되면 변환 횟수에서는 제외되나 변환된 다른 NFD 파일들과 함께 하위 폴더로 이동되므로 별도의 구분 없이 사용해도 된다.