2012-01-24 19 views
5

Próbuję znaleźć wszystkie pliki tekstowe, które mają kodowanie iso-8859-1 i przekonwertować je do UTF-8. Moja próba tak daleko jest:xargs: zmienne podstawienie po przekierowaniu

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

The (oczywiste) Problem polega na tym, że ostatni zmienna podstawienie nie będzie działać, ponieważ {} występuje po przekierowaniu, a nie należą do xargs. Ponieważ otrzymuję tylko jeden plik o nazwie {}.converted, a nie a.txt.converted, b.txt.converted itd. Jak mogę to zrobić?

Uwaga: Robię to na Cygwin, gdzie iconv nie obsługuje obsługi -o.

+0

Proszę spojrzeć na to [powiązane pytanie] (http://stackoverflow.com/q/845863/183066). – jcollado

+0

Nie wiem, którą odpowiedź przyjąć. Odpowiedzi e.dan i glenn są najbardziej pragmatyczne, ale Ole Tanges jest najbardziej estetyczny. chorobas jest również całkiem niezły. Muszę o tym pomyśleć. –

Odpowiedz

3

Jeśli masz GNU Parallel http://www.gnu.org/software/parallel/ zainstalowany można to zrobić:

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

Można zainstalować GNU Parallel prostu przez:

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

Obejrzyj wideo z wprowadzeniem dla GNU Parallel, aby dowiedzieć się więcej: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1

Jak o for pętla jak:

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

Jak rozwiąże się twoje rozwiązanie z plikiem: "12-ci rekord mojego brata: Lista a-> z.txt'? –

1

Zakładając, że żaden z plików mają znaki nowej linii w nazwie, a zakładając, że masz GNU find i xargs ::

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 

Z grep -l, nie potrzebujesz polecenia cut w potoku.

0

Jesteś prawie tam:

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

W jaki sposób twoje rozwiązanie poradzi sobie z plikiem:' Rekordy mojego brata 12 ": Lista a-> z.txt '? –

0

Powtórz polecenie, które ma działać xargs na łańcuchu, który jest podłączony do powłoki, a to pozwoli przezwyciężyć problem z podstawieniem.

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