2012-01-24 10 views
5

Kodlama iso-8859-1 kodlu tüm metin dosyalarını bulmaya çalışıyorum ve bunları UTF-8'e dönüştürüyorum. {} yönlendirme sorunları ortadanxargs: yönlendirme sonrası değişken ikamesi

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted 

(bariz) Sorun, son değişken ikame çalışmaz ve xargs ait değil: My girişimi öylesine uzaktır. Ben sadece {}.converted, a.txt.converted, b.txt.converted gibi bir dosya alıyorum. Bu işi nasıl yapabilirim?

Not: Cygwin'de bunu yapıyorum, burada iconv -o'u desteklemiyor.

+0

Lütfen bu konuyla ilgili [http://stackoverflow.com/q/845863/183066] adresine bakın. – jcollado

+0

Hangi cevabın kabul edileceğini bilmiyorum. e.dan ve glenn'in cevapları en pragmatiktir, ama Ole Tanges en estetik olarak hoştur. chorobas da oldukça güzel. Bunu düşünmek zorundayım. –

cevap

3

GNU Paralel http://www.gnu.org/software/parallel/ yüklü bunu yapabilirsiniz varsa:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

:

find . -name '*.txt' | parallel grep -il iso-8859-1 | parallel iconv -f ISO-8859-1 -t UTF-8 {} \> {}.converted 

Sen tarafından basitçe GNU Paralel yükleyebilirsiniz Daha fazla bilgi edinmek için GNU Parallel'in tanıtım videolarını izleyin: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1

Nasıl hakkında for döngü gibi: Dosyalarınızın hiçbiri varsayarsak

for file in `find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1`; do 
    iconv -f ISO-8859-1 -t UTF-8 $file > $file.converted 
done 
+0

Çözümünüz dosyayla nasıl ilgilenecek: 'Kardeşimin 12 'kayıtları: Listelenen a-> z.txt'? –

1

adına yeni satır karakterlerini varsa ve GNU bulmak zorunda varsayarak ve Xargs :: grep -l ile

find . -name '*.txt' -print0 | 
xargs -0 grep -l 'iso-8859-1' | 
while read -r file; do 
    iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file".converted 
done 

, Boru hattında cut komutuna ihtiyacınız yoktur.

0

Neredeyse vardır:

find . -name '*.txt' | xargs grep -i iso-8859-1 | cut -f1 -d: | \ 
xargs -I% echo iconv -f l1 -t utf8 % \> %.utf | bash 
+0

Çözümünüz dosyayla nasıl başa çıkacak:' Kardeşimin 12' kayıtları: Listeli a-> z.txt '? –

0

xargs komutunun kabukta bulunan ve değiştirme sorununu aşacak bir dizeye işlemesini istediğiniz komutu ekleyin.

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs echo "iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted" | bash