Php 复制包含符号链接的继承目录

Php 复制包含符号链接的继承目录,php,bash,symlink,Php,Bash,Symlink,这类似于以前提出的问题,但我保证这是不同的 我有一个站点,涉及从父站点到子站点的继承。其中一部分是媒体。为了加快媒体服务速度,我在子目录中创建父目录的符号链接副本,然后使用子目录专门定义的任何文件覆盖这些副本。这允许apache从媒体(可能来自父媒体)静态地提供服务,同时从父媒体继承html 构建后的示例,其中继承是常见的->地图->汽车: /some/directory/common/ images/ cats.png muffins.png css/

这类似于以前提出的问题,但我保证这是不同的

我有一个站点,涉及从父站点到子站点的继承。其中一部分是媒体。为了加快媒体服务速度,我在子目录中创建父目录的符号链接副本,然后使用子目录专门定义的任何文件覆盖这些副本。这允许apache从媒体(可能来自父媒体)静态地提供服务,同时从父媒体继承html

构建后的示例,其中继承是常见的->地图->汽车:

/some/directory/common/
   images/
      cats.png
      muffins.png
   css/
      styles.css

/some/directory/maps/
   images/
      cats.png -> /some/directory/common/images/cats.png
      muffins.png (overridden by child)
   css/
      styles.css -> /some/directory/common/css/styles.css
      mapsStyles.css (child only)

/some/directory/cars/
   images/
      cats.png -> /some/directory/common/images/cats.png
      muffins.png -> /some/directory/maps/images/muffins.png
   css/
      styles.css -> /some/directory/common/css/styles.css
      carsStyles.css (child only)
因此,我可以符号链接到
/images/muffins.png
,并根据我所在的站点接收正确的媒体。特定于站点的介质存储在相同的目录结构中,但位于不同的位置,仅包含特定于该站点的介质

问题是,无论我怎么做,第二个孩子最终都会有一个指向其父代的符号链接,而不是原始人。在上面的示例中,我无法通过编程将
/some/direcory/cars/images/cats.png
指向公共媒体,而只能指向地图媒体

目前我正在使用命令
cp-sR/some/directory/maps/*/some/directory/cars/


我在PHP上运行这个,但目前在PHP
exec()
函数中使用
cp
ln
命令来构建这些结构。

如果问题只是链接。。。。。你可以试试“cp-l”。。。。(有关更多信息,请查看曼恩cp)

手册页:

-l, --link
     hard link files instead of copying

因此,应该解决这个问题

似乎您应该使用
tar
而不是
cp
: 请尝试(我现在无法测试它;请注意您的tar版本在默认情况下对符号链接所做的操作。它应该将它们保存为符号链接,而不是跟随它们…而是ymmv):


s标志可以做到这一点,它只是不创建与原始标志具有相同目标的符号链接。它创建指向复制的符号链接的链接。我的理解是-l将创建硬链接,而不是符号链接,-s标志用于符号链接,-l标志用于硬链接人信息:--s,--符号链接创建符号链接而不是复制我相信我在问题中说过我正在创建符号链接,不是硬链接。只需浏览questino而不需要花时间去摸索:这听起来像是一个使用
tar
(根据需要提供有关符号链接的适当选项)而不是
cp
…的时候,因此您希望向父级创建符号链接,除非父级已经包含符号链接,那么它应该是原始的符号链接?正确,巴尔马。否则,我会得到太多级别的符号链接。我正在检查这个…但它看起来很有希望。我会再打给你。@boerema:我可能还没有真正回答你关于“家长/孩子”的问题,但我希望我理解了下面的需要^^^^即,只需在其中一个目录中添加最常用的链接(或者创建一个目录,每个目录都有常用的链接),将其清理为只包含常用的内容,然后使用它来“kickstart”新的孩子们。。。然后根据需要用特定链接替换普通链接(并添加所需内容)。我认为您先将父目录加上tar并将其解压到子目录中的解决方案将保留原始符号链接,从而解决我的问题。@boerema:另一种相互测试方法:步骤1:创建一个MD5sum(或sha1)文件列表,其中/some/directory/common:每行包含:“theMD5/path/to/file”。步骤2:创建子对象。创建另一个“Themmd5/path/of/child/和/file”列表第3步:为MD5的每个匹配项比较2;执行适当的二进制差异,如果匹配,则替换为指向/path/to/file的符号链接。但所有这些(+问题)假设你从未在孩子的文件中写入(或者它将跟随符号链接并更改公共文件!),这最终成为我需要做的一个很好的方法
#step 1: create an archive of one of the directories_using_common_symlinks:
cd /some/directory/maps/
tar cvf /somewhere/wholeshebang.tar images/ css/
        #ie, tar everything (directories, symlinks, etc).
        #Please add whatever is missing
        #note: it will also contain extra (specific) stuff, which we get rid of below

#step 2: create the real archive of JUST the common stuff
cd /some/temporary_dir/
tar xvf /somewhere/wholeshebang.tar  #regurgitate all the content.
rm      /somewhere/wholeshebang.tar  #we won't need that one anymore, it contains too much
rm images/muffins.png  css/mapStyles.css #delete all extra stuff
tar cvf /somewhere/just_commons.tar  #recreate tar, this time with only common stuff.

#step 3: use the new archive to "kickstart" the other directories
cd /the/destination
tar xvf /somewhere/just_commons.tar  #regurgitte the common stuff (dirs, symlinks)
#then add whatever is specific to /the/destination