我想制作一个目录的精确副本(其中包含子目录、文件和符号链接),但我希望目标目录中的每个文件都是指向原始文件的符号链接。
我已经可以使用以下方法实现这一点:
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