【问题标题】:replace part of file name with wrong encoding用错误的编码替换部分文件名
【发布时间】:2020-03-23 09:33:11
【问题描述】:

需要一些指导如何解决这个问题。在编码搞砸的多个子文件夹中拥有 10 000 个文件。通过 ls 命令,我看到一个名为 'F'$'\366''ljesedel.pdf' 的文件名,其中包括开头和结尾的 '。这只是瑞典字符 åäö 出错的一个例子,在这个例子中应该是“Följesedel.pdf”。如果我跑 #>找到。 然后我看到这样的文件列表: ./F?ljesedel.pdf

编码不一样。到底怎么解决这个问题?最明显的方法:

  myvar='$'\366''
  char="ö"
  find . -name *$myvar*   -exec rename 's/$myvar/ö'  {} \;

和其他可能的方式失败,因为 找 。 -name 找不到它,因为 ?而不是“真实”字符“'$'\366''”

任何建议或指导将不胜感激。

【问题讨论】:

  • \366 对于 \x{F6} 或 ö 是八进制。最好运行一个 Perl 脚本来将一些逻辑放入其中。比如s/'\$'\\([0-3][0-7]{2})''/func($1)/eg然后在func中,将八进制文本转换成字符返回(替换)。
  • ///e 的形式是 eval()。
  • 最后我自己解决了。重命名命令不行,重要的是找出文件的编码然后运行:find ./ -execdir convmv -fiso-8859-1 -tutf8 {} \;当确定它工作时,只需添加 --notes

标签: regex bash perl rename batch-rename


【解决方案1】:

第一个问题是您的终端需要什么编码。确保是 UTF-8。

然后您需要找到实际文件名包含的字节,而不仅仅是可能显示的内容。您可以使用 perl oneliner 来执行此操作,如下所示,在包含文件的目录中运行:

perl -E'opendir my $dh, "."; printf "%s: %vX\n", $_, $_ for grep { m/jesedel\.pdf/ } readdir $dh'

这将输出解释为 UTF-8 字节的文件名(如果您已将终端设置为该字节),然后是它实际包含的十六进制字节。

您可以使用它来确定您的搜索模式应该是什么。您的替换必须是 ö 的 UTF-8 编码表示,如果您的终端设置为默认情况下,它将作为命令参数的一部分。

【讨论】:

    【解决方案2】:

    我不是专家 - 但文件名可能不是问题(它似乎包含正确的 Unicode 文件名) - 但使用 ls (和许多其他实用程序)向终端显示名称的方式.

    通过将终端字符编码设置为 Unicode,我能够显示正确的名称。我还注意到 GUI 程序(文件管理器等)能够显示正确的文件名。

    Gnome 终端:“终端 .. 设置字符编码 - Unicode UTF8

    对于许多实用程序来说,“选择”这些文件(例如,REGEXP、通配符)仍然是一个挑战。在少数情况下,您必须使用“*”模式选择这些字符。如果这是考虑仅使用 Ascii 的主要问题 - 可能使用 'o' 而不是 'ö'。不确定这是否可以接受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多