디렉토리의 모든 * .php 파일을 열거하고 적용하는 bash 스크립트 iconv
가 있습니다. STDOUT으로 출력됩니다.
-o
내 경험에 매개 변수를 추가하면 실제로 변환하기 전에 빈 파일을 작성하기 때문에 변환을 수행하도록 스크립트를 조정 한 다음 입력 파일을 덮어 쓸 수 있습니까?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
디렉토리의 모든 * .php 파일을 열거하고 적용하는 bash 스크립트 iconv
가 있습니다. STDOUT으로 출력됩니다.
-o
내 경험에 매개 변수를 추가하면 실제로 변환하기 전에 빈 파일을 작성하기 때문에 변환을 수행하도록 스크립트를 조정 한 다음 입력 파일을 덮어 쓸 수 있습니까?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
답변:
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
은 모든 필터 프로그램 에만 적용되는 것은 아닙니다 . 몇 가지 특별한 경우를 언급 할 가치가 있습니다.
-p
에는 -i
파일을 대체 할 수있는 옵션이 있습니다.grep
, tr
, sed 's/long input text/shorter text/'
당신이 진정으로 할 수 있습니다), 당신은 위험 살고 있습니다 장소에 파일을 수정 (여기에 언급 된 다른 솔루션이를 만들 새 출력 파일을 찾아서 끝 부분으로 옮기십시오. 그래서 어떤 이유로 명령이 중단되면 원본 데이터는 변경되지 않습니다).sponge
Joey Hess에게만 귀속되어야 하는지 잘 모르겠습니다 . 그것은 그가 유지 하는 패키지 moreutils
를 포함 sponge
하지만 sponge
의 홈페이지에서 링크를 따라 의 출처와 관련하여 moreutils
원래 Colin Watson에 의해 포스팅되고 포함되도록 제안한 것을 발견했습니다 . "Joey는 내가 쓴 것들 중에서 내가 가장 좋아하는 것은 sponge
"(2006 년 2 월 6 일 월요일)입니다.
iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
은 -o
매개 변수 와 관련하여 매우 영리 하며 출력 파일이 입력과 동일한 것을 감지하면 내부적으로 임시 파일을 관리하므로 작동합니다.
다른 방법은 recode
일부 변환에 libiconv 라이브러리를 사용하는입니다. 동작은 입력 파일을 출력으로 바꾸는 것이므로 다음과 같이 작동합니다.
for file in *.php
do
recode cp1251..utf8 "$file"
done
으로 recode
매개 변수로 여러 입력 파일을 받아, 당신은 마련 할 수있는 for
루프 :
recode cp1251..utf8 *.php
info recode
대신 시도하십시오 . 더 장황하다.
다음은 간단한 예 입니다. 시작하기에 충분한 정보를 제공해야합니다.
#!/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;
하나의 옵션은 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