iconv를 입력 파일을 변환 된 출력으로 바꾸려면 어떻게해야합니까?


69

디렉토리의 모든 * .php 파일을 열거하고 적용하는 bash 스크립트 iconv가 있습니다. STDOUT으로 출력됩니다.

-o내 경험에 매개 변수를 추가하면 실제로 변환하기 전에 빈 파일을 작성하기 때문에 변환을 수행하도록 스크립트를 조정 한 다음 입력 파일을 덮어 쓸 수 있습니까?

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file"
done

“>”에 관한 경고를 참조하십시오 .
— G-Man

답변:


76

iconv먼저 출력 파일을 작성 하기 때문에 (파일이 이미 존재하므로 잘림) 입력 파일을 읽기 시작합니다 (현재 비어 있음). 대부분의 프로그램은이 방식으로 동작합니다.

출력을위한 임시 파일을 새로 만든 다음 제 위치로 이동하십시오.

for file in *.php
do
    iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
    mv -f "$file.new" "$file"
done

플랫폼에 iconv가 없으면 -o쉘 리디렉션을 사용하여 동일한 효과를 얻을 수 있습니다.

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
    mv -f "$file.new" "$file"
done

Colin Watson의 sponge유틸리티 ( Joey Hess의 moreutils에 포함 )는 다음을 자동화합니다.

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done

이 답변 iconv은 모든 필터 프로그램 에만 적용되는 것은 아닙니다 . 몇 가지 특별한 경우를 언급 할 가치가 있습니다.

  • GNU sed 및 Perl -p에는 -i파일을 대체 할 수있는 옵션이 있습니다.
  • 파일이 매우 큰 경우, 필터는 수정하거나 일부 부품을 제거하지만, 결코 (예를 들어 물건을 추가 grep, tr, sed 's/long input text/shorter text/'당신이 진정으로 할 수 있습니다), 당신은 위험 살고 있습니다 장소에 파일을 수정 (여기에 언급 된 다른 솔루션이를 만들 새 출력 파일을 찾아서 끝 부분으로 옮기십시오. 그래서 어떤 이유로 명령이 중단되면 원본 데이터는 변경되지 않습니다).

3
저자의 저작권이 spongeJoey Hess에게만 귀속되어야 하는지 잘 모르겠습니다 . 그것은 그가 유지 하는 패키지 moreutils를 포함 sponge하지만 sponge의 홈페이지에서 링크를 따라 의 출처와 관련하여 moreutils원래 Colin Watson에 의해 포스팅되고 포함되도록 제안한 것을 발견했습니다 . "Joey는 내가 쓴 것들 중에서 내가 가장 좋아하는 것은 sponge"(2006 년 2 월 6 일 월요일)입니다.
— imz-Ivan Zakharyaschev

3
나는 맥 OS를 사용의 iconv에는 -o 옵션이 없다, 나는`의 iconv -f CP1251을 변경해야 -t UTF8 -o "$ file.new"에서 "$ 파일"`iconv -f cp1251 -t utf8 "$file" > "$file.new"
— code4j

과 같은 일부 명령 sort은 -o매개 변수 와 관련하여 매우 영리 하며 출력 파일이 입력과 동일한 것을 감지하면 내부적으로 임시 파일을 관리하므로 작동합니다.
— jesjimher

56

다른 방법은 recode일부 변환에 libiconv 라이브러리를 사용하는입니다. 동작은 입력 파일을 출력으로 바꾸는 것이므로 다음과 같이 작동합니다.

for file in *.php
do
    recode cp1251..utf8 "$file"
done

으로 recode매개 변수로 여러 입력 파일을 받아, 당신은 마련 할 수있는 for루프 :

recode cp1251..utf8 *.php

2
고마워, 더 많은 공감이 필요합니다. 인코딩 사이에 2 개의 점에 대해 매뉴얼에서 어디를 쳐다보고 있는지 궁금합니다.
— neurino

2
"요청은 종종 BEFORE..AFTER, BEFORE 및 AFTER가 문자셋 인 것처럼 보입니다." 조언 : info recode대신 시도하십시오 . 더 장황하다.
— manatwork

4

지금은

find . -name '*.php' -exec iconv -f CP1251 -t UTF-8 {} -o {} \;

매력처럼 작동합니다


5
처음에는 실제로 작동한다고 생각했습니다. 그러나 32K를 초과하는 출력은 차단 된 것으로 보이며 더 많은 입력으로 코어 덤프를 트리거합니다.
— x-yuri

1

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -sc '%!iconv -f cp1251 -t utf8' -cx "$file"
  1. % 모든 줄을 선택하십시오

  2. ! 명령을 실행

  3. x 저장하고 닫습니다


0

다음은 간단한 예 입니다. 시작하기에 충분한 정보를 제공해야합니다.

#!/bin/bash
#conversor.sh
#Author.....: dede.exe
#E-mail.....: dede.exe@gmail.com
#Description: Convert all files to a another format
#             It's not a safe way to do it...
#             Just a desperate script to save my life...
#             Use it such a last resort...

to_format="utf8"
file_pattern="*.java"

files=`find . -name "${file_pattern}"`

echo "==================== CONVERTING ===================="

#Try convert all files in the structure
for file_name in ${files}
do
        #Get file format
        file_format=`file $file_name --mime-encoding | cut -d":" -f2 | sed -e 's/ //g'`

        if [ $file_format != $to_format ]; then

                file_tmp="${unit_file}.tmp"

                #Rename the file to a temporary file
                mv $file_name $file_tmp

                #Create a new file with a new format.
                iconv -f $file_format -t $to_format $file_tmp > $file_name

                #Remove the temporary file
                rm $file_tmp

                echo "File Name...: $file_name"
                echo "From Format.: $file_format"
                echo "To Format...: $to_format"
                echo "---------------------------------------------------"

        fi
done;

0
echo "`iconv -f cp1251 -t utf8 $file`" > "$file"

나를 위해 일한다


0

당신은 찾기를 사용할 수 있습니다, 적어도 이것은 Raspbian Stretch에서 나를 위해 일했습니다 :

find . -type f -name '*php' -execdir iconv -f cp1251 -t UTF-8 '{}' -o '{}'.tmp \; -execdir mv '{}'.tmp '{}' \;

0

하나의 옵션은 perl의 인터페이스를 사용 iconv하고 그 자리에서 -i편집 할 수있는 모드를 사용하는 것입니다.

perl -MText::Iconv -i -pe '
  BEGIN{$i=Text::Iconv->new(qw(cp1252 UTF-8));$i->raise_error(1)}
  $_ = $i->convert($_)' ./*.php

GNU awk를 사용하면 다음과 같은 작업을 수행 할 수도 있습니다.

gawk -v cmd='iconv -f cp1252 -t utf-8' -i inplace '
  {print | cmd}; ENDFILE {close(cmd)}' ./*.php

ksh93쉘은 또한이 >;명령이 성공하면 리디렉션 된 파일 이름이 변경되는 임시 파일에 출력을 저장하는 대한 연산자를 :

for f in *.php; do
  iconv -f cp1252 -t utf-8 < $f >; $f
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.