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.