【发布时间】:2019-06-22 15:53:06
【问题描述】:
我有一个客户端使用最荒谬的文件/文件夹命名,并且需要将他们的数据 RSYNC 到 NAS。我的 RSYNC 逻辑是用 Perl 编写的,quotemeta() 运行良好,直到我们不得不处理丹麦字符。
查看示例代码:
#!/usr/bin/env perl
$my_string_a = "/data/stuff/folder K/ \snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere";
$my_string_b = quotemeta($my_string_a);
print "\n".$my_string_a."\n".$my_string_b."\n";
exit;
输出:
/data/stuff/folder K/ snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere
\/data\/stuff\/folder\ K\/\ snappy\/SLE\.T\.TET\/Div\ \(erse\)\/SLETTET\/Disk\ kl\�\�bere
注意:我必须使用转义字符,因为 ssh / rsync 在 Perl 中需要“双重转义”。
是否有更好的罐装解决方案,或者我是否需要通过正则表达式来解决这个问题?
【问题讨论】:
-
perldoc -f quotemeta中的这一点可能适用于您的情况:“在 Perl v5.14 中,所有非 ASCII 字符都在非 UTF-8 编码的字符串中引用,但在 UTF- 8 个字符串。从 Perl v5.16 开始,Perl 采用了 Unicode 定义的策略来引用非 ASCII 字符;ASCII 字符的引用没有改变。..." -
如果您声称您的脚本包含非 ASCII 字符(例如
æ),但您没有使用use utf8;,那么您就是在做错事/具有欺骗性。 -
不清楚你在问什么。你是在问你所做的是否正确?要知道这一点,我们需要知道是什么消耗了脚本的输出。在我看来,如果编写远程执行的命令,应该涉及 String::ShellQuote 的
shell_quote。 -
@ikegami 我知道我的代码不正确,因为它未能通过 rsync。让我扩展一下……我正在接收 HTML 编码的服务器路径,我需要在 rsync 目标中使用这个提供的路径。发生的事情是我的输入路径(例如 $my_string_a)在我的 rsync 中变成了 $my_string_b。阅读 cmets 我假设我需要进行字符编码转换才能使其工作?
-
不知道。准确显示您的输入(例如,使用
sprintf("%vX", $input)),并且如上所述,确定输出的使用方式。
标签: perl ssh escaping rsync non-ascii-characters