[*inx] Find 명령만으로 모든 파일의 한글 인코딩 변환하기 Develop Tip

오전에 리눅스에서  수십 개 이상의 디렉터리와 백여 개 이상의 파일이 있는 곳에서
과거 EUC-KR 로 인코딩 되어 있던 파일을 UTF-8로 코드 변환을 해야할 필요가 있었습니다.
(혹은 윈도우의 코드페이지 947로 되어 있는 파일을 리눅스에 가지고 가서
 UTF-8로 변환할 경우도 마찬가지 입니다.)

물론 쉘 프로그램을 몇 줄 짜서 작업을 해도 되지만,
Linux, Mac 등이 기본으로 가지고 있는 find 명령을 이용해 보기로 했습니다.

$ find . -type f -execdir iconv -f euckr -t utf-8 {} -o {}.tmp \; -execdir mv -f {}.tmp {} \;

위의 한 줄로 가능합니다.

이제 설명해 보겠습니다.

find . 
현재 디렉터리 . 에서 시작하여 모든 디렉터리 항목을 살피되,

-type f 
디렉터리를 제외하고 실제 파일만 표시하며,

-execdir iconv -f euckr -t utf-8 {} -o {}.tmp \;
일단 -exec 나 -execdir 모두 그 다음에 나오는 명령을 수행하되 \; 에서 끝이 나도록 합니다.
또한 {} 은 현재 매칭된 파일이름이 치환됩니다.
-exec는 {} 치환 시 find에서 찾은 full path 혹은 상대 path의 경로가 포함되어 나타나며,
-execdir {} 치환 시 실제 해당 하위 디렉터리에 들어가서 패스명을 제외한 파일명만 치환됩니다.
따라서 위에 명령은 각 하위디렉터리를 들어가서 모든 파일에 대하여
euckr을 utf-8 로 iconv 명령을 사용하여 변환하되 그 결과는 해당 파일명에 .tmp 를 붙인 결과가 저장됩니다.

-execdir mv -f {}.tmp {} \;
이전 명령에서 변환한 결과를 .tmp 확장자를 추가해서 붙여 놓았으므로,
이 명령에서 다시 원본으로 되돌리는 역할을 수행합니다.


어느분께는 도움이 되셨기를...

덧글

  • 초보묵향 2014/12/11 23:46 # 삭제 답글

    감사합니다.. 한번에 모두 변환됩니다. 최고네요..
  • 지훈현서아빠 2014/12/12 09:18 #

    도움이 되셨다니 저의 보람입니다. ^^
  • 코드의추억 2015/05/19 17:19 # 삭제 답글

    완전 최곱니다. 예술의 경지 입니다.
  • 지훈현서아빠 2015/05/19 20:54 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 초이 2017/02/16 12:32 # 삭제 답글

    해당 기능을 cron으로 잡아두고 특정 폴더 및 하위 폴더에 한해서 *.txt 파일들만 cp 949를 UTF-8로 자동변환되는 스크립트가 필요합니다.

    혹시 어찌 수정을 하면 될런지요. 너무 간결하고 정확한 코드 감사 합니다.

    답변 기다리겠습니다.
  • 지훈현서아빠 2017/02/16 14:54 #

    find /watch_dir -name "*.txt" -execdir iconv -f euckr -t utf-8 {} -o {}.tmp ; -execdir mv -f {}.tmp {} ;

    위의 내용을 cron에 넣어두면 될 듯 하네요~
    도움이 되셨기를 바랍니다
  • 초보 2019/03/25 17:41 # 삭제 답글

    감사합니다 많은 도움이 되었습니다.
  • 지훈현서아빠 2019/03/25 22:54 #

    도움이 되셨다니 저의 보람입니다~~ ^^
댓글 입력 영역

구글애드텍스트