OSX изменить кодировку файла (iconv) рекурсивно

Я знаю, что могу преобразовать одну кодировку файла под OSX, используя:

iconv -f ISO-8859-1 -t UTF-8 myfilename.xxx > myfilename-utf8.xxx

Я должен конвертировать кучу файлов с конкретным расширением, поэтому я хочу преобразовать кодировку файла из ISO-8859-1 в UTF-8 для всех.* ext файлы в папке/mydisk / myfolder

возможно, someobe знать синтаксис, как это сделать

спасибо

ekke

7 ответов


комментарий Адама показал мне, как его решить, но это был единственный синтаксис, который я заставил его работать:

find /mydisk/myfolder -name \*.xxx -type f | \
    (while read file; do
        iconv -f ISO-8859-1 -t UTF-8 "$file" > "${file%.xxx}-utf8.xxx";
    done);

- i ... -о. .. не работает, но >

thx снова

ekke


Если ваша оболочка bash, что-то вроде этого

for files in /mydisk/myfolder/*.xxx
do
  iconv -f ISO-8859-1 -t UTF-8 "$files" "${files%.xxx}-utf8.xxx"
done

вот пример, проверенный в mac 10.10. Найдите файл по имени, конвертируйте код, затем замените исходный файл.работать идеально. Спасибо за пример Романа Трубу, скопируйте полный код ниже в свой сценарий оболочки.

   #!/bin/bash
        find ./ -name *.java -type f | \
        (while read file;
            do if [[ "$file" != *.DS_Store* ]]; then
            if [[ "$file" != *-utf8* ]]; then
                iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file-utf8";
                rm $file;
                echo mv "$file-utf8" "$file";
                mv "$file-utf8" "$file";
            fi
        fi 
        done);

попробуйте это ... его тестирование и работа:

первый шаг (ICONV): найти /var / www / - name *.в PHP -тип F | (во время чтения файла; сделать функцию iconv -F в ИСО-8859-2 -т в UTF-8 "$файл" > "${файл%.РНР.}phpnew"; сделал)

второй шаг (переписать-MV): найти /var / www / - name"*.phpnew " - введите f / (при чтении файла; do MV $file echo $file | sed 's/\(.*\.\)phpnew/php/' ; сделал)

его просто вывод о моих исследованиях:)

надеюсь, это поможет Якуб Rulec


вы можете написать сценарий на любом языке сценариев для итерации по каждому файлу в /mydisk / myfolder, проверьте расширение с помощью regex [.(.* )$], и если это "ext", выполните следующее (или эквивалентное) из системного вызова.

"iconv-F ISO-8859-1 -T UTF-8" + файл.getName () + " > " + файл.getName () + "- utf8.xxx"

Это будет всего несколько строк в Python, но я оставляю его в качестве упражнения для читателя, чтобы пройти через особенности поиска итерации каталога и регулярное выражение.


если вы хотите сделать это рекурсивно, вы можете использовать find(1):

find /mydisk/myfolder -name \*.xxx -type f | \
    (while read file; do
        iconv -f ISO-8859-1 -t UTF-8 -i "$file" -o "${file%.xxx}-utf8.xxx
    done)

обратите внимание, что я использовал | while read вместо -exec вариант поиска (или трубопровода в xargs) из-за манипуляций, которые нам нужно сделать с именем файла, а именно, отсечение .xxx расширение (с помощью ${file%.xxx}) и добавления -utf8.xxx.


Я протянул Альберт.Сценарий Цин:

  • автоопределение текущей кодировки файла
  • добавлен параметр команды для выполнения dry / exec-run
  • добавлен параметр для каталога и имени файла шаблона

    #!/bin/bash
    command=${1-"usage"}
    searchPattern=${2-"*.java"}
    searchDirectory=${3-"."}
    if [[ "$command" == "usage" ]]; then
        echo "convert-file-to-utf8.sh [usage|dry|exec] [searchPattern=$searchPattern] [searchDirectory=$searchDirectory]"
        exit
    fi
    find $searchDirectory -type f -name "$searchPattern" | \
    (while read file;
        do if [[ "$file" != *.DS_Store* ]]; then
        if [[ "$file" != *-utf8* ]]; then
            currentEncoding="$(file --brief --mime-encoding $file)"
            if [[ "$currentEncoding" != "utf-8" ]]; then
               echo "command:$command / iconv -f $currentEncoding -t UTF-8 $file"
               if [[ "$command" == "exec" ]]; then
                 iconv -f $currentEncoding -t UTF-8 "$file" > "$file-utf8";
                 rm $file;
                 echo mv "$file-utf8" "$file";
                 mv "$file-utf8" "$file";
              fi
            fi
        fi
    fi
    done);
    

протестировано на MacOS X 10.12.6 / Sierra.