ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mac에서 한글 인코딩 다 깨졌을 때 모든 파일 변경하기 (find, read, iconv)
    개발 환경/Mac 2020. 3. 16. 19:52
    반응형

    윈도우에서 만든 txt 파일이 맥에서 열면 위와 같이 고대어가 된다. 찾아보니 원인은 윈도우에서 작성된 파일이 'cp949'로 인코딩되었기 때문이란다. 폴더 하부에 있는 모든 txt파일까지 전부 다시 'uft-8'로 바꿔보자.

     

    1. find 명령어

    find 명령어는 검색어에 따라 파일을 찾아주는 명령어이다. 나의 타겟은 txt파일이다.

    find . -name "*.txt"

    위에 .은 현재 디렉토리를 말하고 현재 디렉토리부터 하위 디렉토리까지 모두 검색한다. -name은 검색어고 "*.txt"에서 *은 모든 경우을 말한다. 위 명령어를 실행하면 현재 디렉토리부터 하위 디렉토리까지 모든 txt파일을 찾아준다.

     

    2. iconv 명령어

    iconv 명령어는 문자열의 인코딩을 바꿔주는 명령어이다. 나는 현재 'cp949'에서 'utf-8'로 바꿔야한다.

    iconv -c -f cp949 "tmp.txt" > "tmp2.txt"

    위에 -c는 에러를 막아준다고 간단히 생각하면 되고, -f cp949는 현재 파일의 인코딩(from)을 뜻한다. -t utf-8의 옵션(to)을 넣어주면 utf-8로 설정해주지만 안넣어도 자동으로 설정된다. 앞에 tmp.txt는 타겟 파일을 말하고 뒤에 tmp2.txt는 목적 파일을 말한다. 쉽게 말해서 tmp.txt를 cp949에서 utf-8로 바꿔주고 tmp2.txt라고 저장한다. 여기서 같은 이름을 쓰면 덮어써줄거 같지만 안된다.

     

    3. 한꺼번에 다 바꾸기

    find . -name "*.txt" | \
    while read filename
    do
    tempName=${filename}~temp~.txt
    mv "$filename" "$tempName"
    iconv -c -f cp949 "$tempName" > "$filename"
    rm "$tempName"
    echo $filename
    done

    A. find . -name "*.txt"

    는 위에서 설명했고, |(파이프)이 있기때문에 앞 명령어의 결과를 뒤 명령어의 입력으로 사용한다.

    B. while read filename     do     done

    뒤 명령어는 while문인데 큰 구조는 read 명령어를 통해 한줄씩 읽어온후 filename에 저장한다.

    while read filename
    do
    ...
    done

    C. tempName=${filename}~temp~.txt

    filename을 기반으로 임시로 다른 이름을 지정한다. 새로 인코딩한 파일 이름을 위한 것이다.

    D. mv "$filename" "$tempName"

    원래 파일 이름을 tempName로 지정된 문자열로 바꾼다.

    E. iconv -c -f cp949 "$tempName" > "$filename"

    위에서 설명했다.

    F. rm "$tempName"

    기존 cp949 파일을 삭제

    G. echo $filename

    filename을 출력

     

    이러한 프로세스가 읽어올 파일 이름이 없을때까지 계속 진행된다.

     

    4. 결론

    제대로 바뀐 것을 확인할 수 있다. 스크립트 작성후 데이터셋 전부에 대해 돌리는데 너무 오래 걸려서 꺼버렸다...

    sentence = np.loadtxt("tmp.txt", encoding='cp949')

    라는 좋은 넘파이 함수가 있기 때문이다..

     


    출처:

    https://brownbears.tistory.com/171

    https://kiboard.tistory.com/75

    https://jupiny.com/2017/07/10/shell-script-basic-5/

    https://recipes4dev.tistory.com/156

     

    반응형
Designed by Tistory.