使用ÅÄÖ将字符更改为AAO unix

时间:2018-01-08 02:45:42

标签: bash unix

我有大约300张图片,其中很多都有Å,Ä或Ö,我想要有效但我对终端不太好。我用谷歌搜索,但没有找到一条有用的线。

图片可以像: String output = instant.toString() ; Generate String in standard ISO 8601 format. Ängelholms.jpgBBC Örebro.jpg

我确实尝试过这样的事情:

Bräckt.jpg

我用这个将空格替换为下划线,但它似乎与我想改变的字母无关。

我该怎么做?

提前致谢!

3 个答案:

答案 0 :(得分:3)

tr无法很好地处理多字节字符的转换。另一方面,sed对UTF-8字符没有问题。您可以执行以下操作:

for file in *; do mv "$file" $(echo "$file" | sed 'y/ÅÄÖåäö/AAOaao/'); done

这当然假设您需要翻译的整个字符集由/ÅÄÖåäö/AAOaao/描述。您需要增加翻译集中的字符数,以包含$file中的所有潜在字符。

使用sed正确处理翻译的一个示例是:

$ echo "ÅÄÖåäö.png" | sed 'y/ÅÄÖåäö/AAOaao/'
AAOaao.png

可能有更有效的方法可以做到这一点,但是对于POSIX shell,这是第一个想到的。

答案 1 :(得分:2)

据我所知,GNU tr(1)还不支持非ASCII字符 (或者我过时了?)

使用Perl,我会说:

#!/usr/bin/perl

use utf8;
use Encode;

for $filename (<*>) {
    ($new = decode('UTF-8', $filename)) =~ tr/ÅÄÖåäö/AAOaao/;
    rename $filename, $new;
}

希望这有帮助。

答案 2 :(得分:2)

怎么样

while read -r char replacement; do
    for file in *"$char"*; do
        mv "$file" "${file//$char/$replacement}"
    done
done <<'____'
    Å A
    Ä A
    Ö o
    å a
    ä a
    ö o
____

使用Bash内置字符串替换功能应该比为每个文件名生成多个进程要快得多,尽管您会注意到我们可能多次重命名文件使用此代码实现所需的结果。 (我认为如果重要的话,重构它就不会太难以避免这种情况。)

您会注意到${var//string/replacement}是Bash扩展程序,而常规/bin/sh无法使用(因此,如果您将其放入shebang行,则必须在shebang行中明确标记对Bash的依赖性一个脚本)。