디렉토리의 모든 * .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
은 모든 필터 프로그램 에만 적용되는 것은 아닙니다 . 몇 가지 특별한 경우를 언급 할 가치가 있습니다.
- GNU sed 및 Perl
-p
에는-i
파일을 대체 할 수있는 옵션이 있습니다. - 파일이 매우 큰 경우, 필터는 수정하거나 일부 부품을 제거하지만, 결코 (예를 들어 물건을 추가
grep
,tr
,sed 's/long input text/shorter text/'
당신이 진정으로 할 수 있습니다), 당신은 위험 살고 있습니다 장소에 파일을 수정 (여기에 언급 된 다른 솔루션이를 만들 새 출력 파일을 찾아서 끝 부분으로 옮기십시오. 그래서 어떤 이유로 명령이 중단되면 원본 데이터는 변경되지 않습니다).
답변
다른 방법은 recode
일부 변환에 libiconv 라이브러리를 사용하는입니다. 동작은 입력 파일을 출력으로 바꾸는 것이므로 다음과 같이 작동합니다.
for file in *.php
do
recode cp1251..utf8 "$file"
done
으로 recode
매개 변수로 여러 입력 파일을 받아, 당신은 마련 할 수있는 for
루프 :
recode cp1251..utf8 *.php
답변
지금은
find . -name '*.php' -exec iconv -f CP1251 -t UTF-8 {} -o {} \;
매력처럼 작동합니다
답변
Ex 모드에서 Vim을 사용할 수 있습니다 :
ex -sc '%!iconv -f cp1251 -t utf8' -cx "$file"
-
%
모든 줄을 선택하십시오 -
!
명령을 실행 -
x
저장하고 닫습니다
답변
다음은 간단한 예 입니다. 시작하기에 충분한 정보를 제공해야합니다.
#!/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;
답변
echo "`iconv -f cp1251 -t utf8 $file`" > "$file"
나를 위해 일한다
답변
당신은 찾기를 사용할 수 있습니다, 적어도 이것은 Raspbian Stretch에서 나를 위해 일했습니다 :
find . -type f -name '*php' -execdir iconv -f cp1251 -t UTF-8 '{}' -o '{}'.tmp \; -execdir mv '{}'.tmp '{}' \;