it-swarm-tr.com

İconv'nin girdi dosyasını dönüştürülmüş çıktıyla değiştirmesini nasıl sağlayabilirim?

Bir dizindeki her * .php dosyası aracılığıyla numaralandırılmış ve iconv uygulayan bir bash komut dosyası var. Bu STDOUT'ta çıktı alır.

-o parametresi (benim durumumda) aslında dönüşüm gerçekleşmeden önce muhtemelen boş bir dosya yazar, betiğimi dönüştürme yapacak şekilde nasıl ayarlayabilirim, sonra girdi dosyasının üzerine yazabilir miyim?

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

iconv ilk önce çıktı dosyasını oluşturduğundan (dosya zaten mevcut olduğundan, dosyayı keser), ardından girdi dosyasını okumaya başlar (bu şimdi boştur). Çoğu program bu şekilde davranır.

Çıktı için yeni, geçici bir dosya oluşturun, ardından yerine taşıyın.

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

Platformunuzda iconv yoksa -o, aynı efekte bir Shell yeniden yönlendirmesi kullanabilirsiniz.

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

Colin Watson'ın sponge yardımcı programı ( Joey Hess 'ın moreutils ) bunu otomatik hale getirir:

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

Bu yanıt yalnızca iconv için değil, herhangi bir filtre programı için geçerlidir. Birkaç özel durumdan bahsetmeye değer:

  • GNU sed ve Perl -p var -i Yerdeki dosyaları değiştirme seçeneği.
  • Dosyanız çok büyükse, filtreniz yalnızca bazı parçaları değiştiriyor veya kaldırıyor, ancak hiçbir şey eklemiyor (ör. grep, tr, sed 's/long input text/shorter text/') ve tehlikeli yaşamayı seviyorsanız, gerçekten dosyayı yerinde değiştirmek (burada belirtilen diğer çözümler yeni bir çıktı dosyası oluşturur ve sonunda yerine yerleştirirsiniz, böylece orijinal komut herhangi bir nedenle kesintiye uğrarsa veriler değişmez).

Alternatif olarak, bazı dönüşümler için libiconv kitaplığını kullanan recode verilebilir. Davranışı, girdi dosyasını çıktı ile değiştirmektir, bu yüzden bu işe yarar:

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

recode birden fazla girdi dosyasını parametre olarak kabul ettiğinden, for döngüsünü yedekleyebilirsiniz:

recode cp1251..utf8 *.php
61
manatwork

Şimdilik

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

tıkır tıkır çalışıyor

4
galeksandrp

Vim'i Ex modunda kullanabilirsiniz:

ex -sc '%!iconv -f cp1251 -t utf8' -cx "$file"
  1. % tüm satırları seç

  2. ! çalıştırma komutu

  3. x kaydet ve kapat

1
Steven Penny

Seçeneklerden biri, Perl 'ın arayüzünü iconv ve -i Modunu yerinde düzenleme için kullanmaktır:

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

GNU awk ile aşağıdakileri de yapabilirsiniz:

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

ksh93 Kabuğunda ayrıca, komutun başarılı olması durumunda çıktıyı yeniden yönlendirilen dosya olarak yeniden adlandırılan bir geçici dosyada saklayan bir >; İşleci vardır:

for f in *.php; do
  iconv -f cp1252 -t utf-8 < $f >; $f
done
0

İşte bir basit örnek . Başlamanız için size yeterli bilgi vermelidir.

#!/bin/bash
#conversor.sh
#Author.....: dede.exe
#E-mail.....: [email protected]
#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
dede.exe
echo "`iconv -f cp1251 -t utf8 $file`" > "$file"

benim için çalışıyor

0
CoNsTaR

Bul'u kullanabilirsiniz, en azından bu benim için Raspbian Stretch'te çalıştı:

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