nfd2nfc is a macOS CLI tool that converts filenames between NFD and NFC for consistent cross-platform compatibility. It also includes a background service that continuously monitors specified folders and automatically applies the necessary conversions in real time.
nfd2nfc-watcher
) is not yet implemented. Currently, only the manual conversion tool (nfd2nfc
) is available.
Help Documentation – a concise overview of nfd2nfc’s commands, options, and usage examples.
![Image](https://private-user-images.githubusercontent.com/93251045/409807641-8eab1691-745d-4136-9c85-48cecd09e8fa.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNTY1NjcsIm5iZiI6MTczOTM1NjI2NywicGF0aCI6Ii85MzI1MTA0NS80MDk4MDc2NDEtOGVhYjE2OTEtNzQ1ZC00MTM2LTljODUtNDhjZWNkMDllOGZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDEwMzEwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM0ZDc4N2JkM2ZlYjA4YTQzZjMwNjc3YzkyZDMyMTc2MDU5NmUzYzdlOTc1MjRlMDUyY2JiYmMxOWM0Mjk1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Audvm7ADeaM-ii5qAskkeKu_p6s1LPwZE41-p6enT8Q)
Background & Test Setup:
- 10,000 sample folders and files were generated in the
tools/test_data
directory using thetools/generate_test_data.py
script. - A zellij session running yazi was used to visually inspect the test data.
- Note: zellij 0.41.2 does not properly handle NFD normalization.
- Conversion commands used:
- Convert from NFD to NFC:
nfd2nfc -r .
- Convert from NFC back to NFD:
nfd2nfc -rR .
- Convert from NFD to NFC:
Below are screenshots that illustrate the conversion results.
![Image](https://private-user-images.githubusercontent.com/93251045/409842388-d1d55f90-ff66-4e87-9958-3f17ef954ca3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNTY1NjcsIm5iZiI6MTczOTM1NjI2NywicGF0aCI6Ii85MzI1MTA0NS80MDk4NDIzODgtZDFkNTVmOTAtZmY2Ni00ZTg3LTk5NTgtM2YxN2VmOTU0Y2EzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDEwMzEwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY1NjJhODhhMDk5MGJjMTQyMTZlNzI3MWVhOTA5OWM4YjU0YmNhZTYzY2JkOTU5N2E2ZDdmMDk4MWZjYzc1NDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.1393Rm6KluC68z1G3h-z17eD_h6jErKAMg0rTAiE__E)
![Image](https://private-user-images.githubusercontent.com/93251045/409842407-a23c4d79-d33f-472f-af3c-456db31cf42e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNTY1NjcsIm5iZiI6MTczOTM1NjI2NywicGF0aCI6Ii85MzI1MTA0NS80MDk4NDI0MDctYTIzYzRkNzktZDMzZi00NzJmLWFmM2MtNDU2ZGIzMWNmNDJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDEwMzEwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdhYjJmZjdlNzRjMWU3ZWQxN2Y1NDYyZDZjMGM5MWQ2OTlhOTVhZTgzOGNkYmQ0ZjkzMWU1MjFlZDk2YWZiZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.G9Ydf2_ueQ9lYqs0ZBych25FeYqZbGWAZmiHKUY6-8Q)
Not yet implemented.