xargs: подстановка переменных после перенаправления - PullRequest
5 голосов
/ 24 января 2012

Я пытаюсь найти все текстовые файлы с кодировкой iso-8859-1 и преобразовать их в UTF-8.Моя попытка на данный момент такова:

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

(Очевидная) проблема в том, что подстановка последней переменной не будет работать, поскольку {} происходит после перенаправления и не принадлежит xargs.Так как я получаю только один файл с именем {}.converted, а не a.txt.converted, b.txt.converted и т. Д. Как я могу сделать эту работу?

Примечание: я делаю это на Cygwin, где iconv не делаеткажется, поддерживает -o.

Ответы [ 5 ]

3 голосов
/ 29 января 2012

Если у вас установлена ​​GNU Parallel http://www.gnu.org/software/parallel/, вы можете сделать это:

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

Вы можете установить GNU Parallel просто:

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

Смотреть видео вступлениядля GNU Parallel, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

2 голосов
/ 24 января 2012

Как насчет петли for, например:

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
1 голос
/ 24 января 2012

При условии, что ни один из ваших файлов не содержит символов новой строки в имени, и при условии, что у вас есть GNU find и 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

С grep -l вам не нужна команда cut в конвейере.

0 голосов
/ 21 декабря 2014

echo команда, с которой вы хотите, чтобы xargs работал, со строкой, которая передается в оболочку и которая преодолеет проблему подстановки.

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs echo "iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted" | bash
0 голосов
/ 24 января 2012

Вы почти у цели:

find . -name '*.txt' | xargs grep -i iso-8859-1 | cut -f1 -d: | \
xargs -I% echo iconv -f l1 -t utf8 % \> %.utf | bash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...