Copie recursivamente um diretório inteiramente como links simbólicos, preservando os links simbólicos atuais

1

Eu gostaria de fazer uma cópia exata de um diretório (que contém sub-diretórios, arquivos e links simbólicos), exceto que eu quero que cada arquivo no diretório de destino seja um link simbólico para o arquivo original.

Isso eu já posso realizar usando:

cp -sR /home/me/SourceDir TargetDir

No entanto, eu gostaria que quaisquer links simbólicos relativos dentro de SourceDir que apontassem para algum outro lugar em SourceDir permanecessem os mesmos links relativos, portanto, agora apontando para TargetDir.

Por exemplo, digamos que o SourceDir contenha o seguinte:

File0
Dir1/File1
Dir1/File2
Dir2/File3
Dir2/File2   <-- this is a symlink to ../Dir1/File2

Então gostaria que o TargetDir se parecesse com:

File0        <-- symlink to  ../SourceDir/File0
Dir1/File1   <-- symlink to  ../../SourceDir/Dir1/File1
Dir1/File2   <-- symlink to  ../../SourceDir/Dir1/File2
Dir2/File3   <-- symlink to  ../../SourceDir/Dir2/File3
Dir2/File2   <-- this is still a symlink to ../Dir1/File2, so: TargetDir/Dir1/File2

Eu não me importaria se isso tivesse que ser feito em duas ou três etapas (algo que eu poderia escrever em um script de shell simples).

Um pensamento que eu tive foi primeiro copiar todos os links simbólicos apenas, em seguida, fazer o cp -sR com um no-clobber.

    
por Madeleine P. Vincent 25.10.2015 / 22:38

1 resposta

2

Você não disse que está em /home/me , mas o comando cp criará todos os seus links como absolutos, onde quer que esteja, ou seja, TargetDir/File0 -> /home/me/SourceDir/File0 etc, não os links relativos ilustrados.

Você pode conseguir o que deseja usando find : -

cp -sR /home/me/SourceDir TargetDir
cd /home/me/SourceDir
find -type l -exec cp -P "{}" "/Path/To/TargetDir/{}" \;
  • O primeiro comando é o seu original.
  • Ao se posicionar no diretório de origem, você o elimina do caminho de localização.
  • O find com cp -P sobrescreve os links com cópias integrais dos links de origem.
  • As aspas duplas permitem arquivos e diretórios com espaços em branco incorporados.

Se você realmente quiser links relativos ( TargetDir/File0 -> ../../SourceDir/File0 etc) para seus arquivos normais, você precisará usar find -type f e executar mkdir -p para criar a estrutura de diretório de destino, então find -type f e executar ls -s para cada arquivo.

    
por 26.10.2015 / 02:33