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.