Como manter os links simbólicos relativos durante a cópia?

1

Eu tenho uma estrutura de diretórios com um monte de links simbólicos relativos. Exemplo:

e: \ test e: \ test \ foo \ a - > ".. \ bar"
e: \ test \ bar \ b - > ".. \ foo"

Existe uma maneira de copiar a totalidade do diretório do pai para um local arbitrário (unidade de backup ...) e manter a relatividade do link simbólico? No exemplo acima, quero que "a" continue apontando para "um nível acima e depois para \ bar".

Eu posso usar o xcopy para copiar profundamente o conteúdo de cada link simbólico, mas isso desperdiça muito espaço.

    
por David Rogers 19.04.2017 / 14:20

1 resposta

1

Você pode usar este script do PowerShell, testado no Windows 10:

param ([string]$Source, [string]$Dest)
Add-Type -AssemblyName Microsoft.VisualBasic
Function ReplaceString($text, $original, $replacement) {
    [Microsoft.VisualBasic.Strings]::Replace($text, $original, $replacement, 1, -1, 'Text')
}
$Source = (Resolve-Path $Source).Path
$Dest = (Resolve-Path $Dest).Path
Function CopySubdir($subdirPath) {
    gci $subdirPath -Force | % {
        If (-not $_.PSIsContainer) {
            Copy-Item $_.FullName -Destination (ReplaceString $_.FullName $Source $Dest)
        } ElseIf ($_.LinkType -ne 'SymbolicLink') {
            $newFolderPath = (ReplaceString $_.FullName $Source $Dest)
            mkdir $newFolderPath
            CopySubdir $_.FullName
        }
    }
}
CopySubdir $Source
gci $Source -Recurse -Force | ? {$_.LinkType -eq 'SymbolicLink'} | % {
    $newPath = (ReplaceString $_.FullName $Source $Dest)
    Push-Location $_.Parent.FullName
    $newTarget = (ReplaceString (Resolve-Path $_.Target).Path $Source $Dest)
    Pop-Location
    New-Item -Path $newPath -ItemType SymbolicLink -Target $newTarget
}

Salve-o como um arquivo .ps1 e siga as instruções de Ativação de scripts em wiki de tags do PowerShell . Você pode então executar o script a partir de um prompt do PowerShell assim:

.\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest'

Ele também trabalha com caminhos relativos, como .\source .

Para executar a partir de um prompt de comando normal:

powershell -command ".\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest'"

O destino deve ser uma pasta vazia que receberá o mesmo conteúdo da pasta de origem. Todos os arquivos e pastas serão copiados como de costume, mas todos os links simbólicos serão examinados e ajustados e copiados depois, quando tudo estiver em vigor.

Algumas ressalvas: Como os usuários padrão não podem criar links simbólicos em condições normais, esse script deve ser executado como administrador. Alguns erros ResourceExists podem ser lançados no último estágio; estes não são fatais e podem ser ignorados.

    
por 19.04.2017 / 20:30