Osx изменить кодировку файла (iconv) рекурсивный
Я знаю, что я могу преобразовать одну кодировку файла под OSX, используя:
iconv -f ISO-8859-1 -t UTF-8 myfilename.xxx > myfilename-utf8.xxx
Мне нужно преобразовать кучу файлов с определенным расширением,
поэтому я хочу конвертировать кодировку файлов из ISO-8859-1 в UTF-8
для всех *.ext файлов в папке /mydisk/myfolder
возможно, некоторые знают синтаксис, как это сделать
спасибо
Ekke
Ответы
Ответ 1
Комментарий Адама показал мне, как его решить,
но это был единственный синтаксис, который я заработал:
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... -o... не работает, но >
спасибо again
Ekke
Ответ 2
если ваша оболочка bash, что-то вроде этого
for files in /mydisk/myfolder/*.xxx
do
iconv -f ISO-8859-1 -t UTF-8 "$files" "${files%.xxx}-utf8.xxx"
done
Ответ 3
Вот пример, протестированный в mac 10.10.
Найдите файл по имени, конвертируйте кодировку, а затем замените оригинальный файл.
Благодарим за пример Роман Трубы, КОПИРУЙТЕ полный код ниже в вашей оболочке script.
#!/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);
Ответ 4
попробуйте это... он проверен и работает:
Первый шаг (ICONV):
find/var/www/-name *.php-type f | (при чтении файла, do iconv -f ISO-8859-2 -t UTF-8 "$ file" > "$ {file%.php}.phpnew"; done)
Второй шаг (REWRITE - MV):
find/var/www/-name "*.phpnew" -type f | (при чтении файла, mv $file echo $file | sed 's/\(.*\.\)phpnew/\1php/'
; done)
Это просто вывод о моих исследованиях:)
Надеюсь, что это поможет
Якуб Рулец
Ответ 5
Вы можете написать script на любом языке сценариев для итерации по каждому файлу в /mydisk/myfolder, проверить расширение с помощью регулярного выражения [. (. *) $], а если оно "ext", запустите следующее (или эквивалент) из системного вызова.
"iconv -f ISO-8859-1 -t UTF-8" + file.getName() + " > " + file.getName() + "-utf8.xxx"
Это всего лишь несколько строк в Python, но я оставляю это как упражнение для читателя, чтобы изучить специфику поиска итераций каталогов и регулярных выражений.
Ответ 6
Если вы хотите сделать это рекурсивно, вы можете использовать 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
.
Ответ 7
Я расширил Albert.Qings script:
- автоопределить текущую кодировку файла
- добавлен параметр команды для выполнения сухих /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.