19

我知道我可以使用以下方法在 OSX 下转换单个文件编码:

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

我必须转换一堆具有特定扩展名的文件,所以我想将文件夹 /mydisk/myfolder 中所有 *.ext 文件的文件编码从 ISO-8859-1 转换为 UTF-8

也许有人知道如何做到这一点的语法

谢谢

爱克

4

7 回答 7

25

亚当的评论向我展示了如何解决它,但这是我使它工作的唯一语法:

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 ... 不起作用,但是 >

再次感谢

爱克

于 2009-07-26T21:42:34.430 回答
3

如果你的外壳是 bash,像这样

for files in /mydisk/myfolder/*.xxx
do
  iconv -f ISO-8859-1 -t UTF-8 "$files" "${files%.xxx}-utf8.xxx"
done
于 2009-07-25T13:23:00.327 回答
2

这是在 mac 10.10 中测试的示例。按名称查找文件,转换编码,然后替换原始文件。工作完美。感谢 Roman Truba 的示例,将下面的完整代码复制到您的 shell 脚本中。

   #!/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);
于 2014-10-14T22:57:46.323 回答
1

试试这个......它已经过测试和工作:

第一步(ICONV):找到/var/www/ -name *.php -type f | (读取文件时;执行 iconv -f ISO-8859-2 -t UTF-8 "$file" > "${file%.php}.phpnew"; 完成)

第二步(REWRITE - MV):找到 /var/www/ -name "*.phpnew" -type f | (读取文件时;做 mv $file echo $file | sed 's/\(.*\.\)phpnew/\1php/';完成)

这只是我研究的结论:)

希望它可以帮助 Jakub Rulec

于 2011-01-10T19:13:08.150 回答
1

我扩展了 Albert.Qings 脚本:

  • 自动检测当前文件编码
  • 添加了一个命令参数来执行干/执行运行
  • 为目录和文件名模式添加了一个参数

    #!/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 上测试。

于 2017-11-23T20:06:45.203 回答
0

您可以使用任何脚本语言编写脚本来遍历 /mydisk/myfolder 中的每个文件,使用正则表达式 [.(.*)$] 检查扩展名,如果它是“ext”,则从一个系统调用。

"iconv -f ISO-8859-1 -t UTF-8" + file.getName() + ">" + file.getName() + "-utf8.xxx"

这只是 Python 中的几行代码,但我将其作为练习留给读者,让他们了解查找目录迭代和正则表达式的细节。

于 2009-07-25T13:00:02.893 回答
0

如果你想递归地做,你可以使用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)并添加.-execxargs.xxx${file%.xxx}-utf8.xxx

于 2009-07-25T13:49:32.180 回答