0

我正在使用 Rsync 和 ICACLS 来同步两个(windows)目录,为此,我必须将相同的路径转换为多个“样式”:cygwin *nix、remote *nix、UNC。(见下面的例子)

我正在使用以下代码来执行此操作,虽然它可以工作,但我使用的正则表达式肯定会变得更健壮和更好地工作(如您所见,我正在替换替换,我发现充其量是丑陋的...)

$remote="remotesrv"
$path="g:\tools\example\"
$local_dos=$path
$remote_dos="\\$remote\"+(($local_dos -replace "^\w","$&$") -replace "(:\\)|(\\)","\")
$local_nix="/cygdrive/"+($local_dos -replace "(:\\)|(\\)","/")
$remote_nix="//$remote/"+(($local_dos -replace "^\w","$&$") -replace "(:\\)|(\\)","/")
"Local DOS  : $local_dos"
"Remote DOS : $remote_dos"
"Local *nix : $local_nix"
"Remote *nix: $remote_nix"

输出是:

Local DOS  : g:\tools\example\
Remote DOS : \\remotesrv\g$\tools\example\
Local *nix : /cygdrive/g/tools/example/
Remote *nix: //remotesrv/g$/tools/example/

有人可以帮我解决上面的正则表达式吗?非常感谢!

4

2 回答 2

0

通常的方法是将路径拆分为其组成部分,翻译这些部分,然后为目标操作系统重新组合这些部分。对于 Windows/Cygwin/DOS,组成部分是:

  • 驾驶
  • 小路
  • 文件名(大多数文件系统中第一个 '.' 之前的部分)
  • 文件扩展名(其中zim.tar.gz有 filename =zim和 extension = .tar.gz

从长远来看,这比尝试一次完成所有操作更容易、更快捷。(我知道——我以前试过一次。)

如果您可以阅读 Perl 代码, Perl 的File::Spec模块可能值得一看。

于 2013-02-13T12:34:41.917 回答
0

这个怎么样:

$local_dos  =  $path
$remote_dos = "\\$remote\$path" -replace ':', '$'
$local_nix  = "/cygdrive/$path" -replace ':?\\', '/'
$remote_nix = "//$remote/$path" -replace ':?\\', '/'

dos 非常简单,并没有真正使用正则表达式。

对于 nix 的,:?\\表示“\ 可选地以:”开头。我们用正斜杠替换它。

对于绝大多数非病理性病例,这应该可以正常工作。但是,它不是防弹的。带有斜杠或冒号的疯狂文件名很容易破坏这一点。

于 2013-02-13T18:10:31.667 回答