0

Rsync と ICACLS を使用して 2 つの (ウィンドウ) ディレクトリを同期しています。そのためには、同じパスをいくつかの「スタイル」に変換する必要があります: cygwin *nix、リモート *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

通常のアプローチは、パスをそのコンポーネントパーツに分割し、パーツを変換してから、宛先OS用にパーツを再結合することです。Windows / Cygwin / DOSの場合、コンポーネントパーツは次のとおりです。

  • ドライブ
  • ファイル名(ほとんどのファイルシステムで最初の「。」の前の部分)
  • ファイル拡張子(zim.tar.gzファイル名=zimおよび拡張子= .tar.gz

長期的には、これは一度にすべてを実行しようとするよりも簡単で高速です。(私は知っています-私は以前にそれを一度にすべて試しました。)

PerlのFile::Specモジュールは、Perlコードを読むことができれば、アイデアを探す価値があるかもしれません。

于 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 に答える