以符号链接的形式递归复制整个目录,并保留当前符号链接

以符号链接的形式递归复制整个目录,并保留当前符号链接

我想制作一个目录的精确副本(其中包含子目录、文件和符号链接),但我希望目标目录中的每个文件都是指向原始文件的符号链接。

我已经可以使用以下方法实现这一点:

cp -sR /home/me/SourceDir TargetDir

但是,我希望 SourceDir 内指向 SourceDir 中其他位置的任何相对符号链接保持相同的相对链接,因此现在指向 TargetDir。

例如,假设 SourceDir 包含以下内容:

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

然后我希望 TargetDir 看起来像:

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

如果这需要分两到三个步骤完成(我可以将其写入一个简单的 shell 脚本),我不会介意。

我的一个想法是首先仅复制所有符号链接,然后使用 no-clobber 执行 cp -sR。

答案1

你没有说你在/home/me,但是你的cp命令会将你的所有链接创建为绝对链接,无论你在何处,即TargetDir/File0 -> /home/me/SourceDir/File0等等,而不是你说明的相对链接。

您可以使用以下方法实现您想要的目标find:-

cp -sR /home/me/SourceDir TargetDir
cd /home/me/SourceDir
find -type l -exec cp -P "{}" "/Path/To/TargetDir/{}" \;
  • 第一个命令是您的原创。
  • 通过将自己定位在源目录中,您可以将其从查找路径中消除。
  • 使用源链接的逐字副本find覆盖cp -P当前链接。
  • 双引号允许文件和目录嵌入空格。

如果您确实想要TargetDir/File0 -> ../../SourceDir/File0普通文件的相对链接(等),则需要使用find -type f和执行mkdir -p来创建目标目录结构,然后对每个文件find -type f执行和。ls -s

相关内容