将更新从源复制到目标目录问题

时间:2015-12-14 20:09:57

标签: bash shell

通常使用 cp -au 从测试目录更新工作目录。这通常符合预期,直到发现:

guest@porteus:~$ echo Update Test
Update Test
guest@porteus:~$ mkdir /tmp/src
guest@porteus:~$ touch /tmp/src/{b,c,d}
guest@porteus:~$ ls -i /tmp/src/{b,c,d}
26019 /tmp/src/b  26020 /tmp/src/c  26025 /tmp/src/d

guest@porteus:~$ ln /tmp/src/b /tmp/src/a
guest@porteus:~$ ls -i /tmp/src
26019 a  26019 b  26020 c  26025 d

guest@porteus:~$ mkdir dst
guest@porteus:~$ cp -a /tmp/src/* dst

guest@porteus:~$ ls -i dst
26002 a  26002 b  26026 c  26034 d

guest@porteus:~$ ln -f dst/c dst/a
guest@porteus:~$ ls -il dst
total 0
26026 -rw-r--r-- 2 guest guest 0 Dec  7 00:00 a
26002 -rw-r--r-- 1 guest guest 0 Dec  7 00:00 b
26026 -rw-r--r-- 2 guest guest 0 Dec  7 00:00 c
26034 -rw-r--r-- 1 guest guest 0 Dec  7 00:00 d

guest@porteus:~$ ls -il /tmp/src/
total 0
26019 -rw-r--r-- 2 guest guest 0 Dec  7 00:00 a
26019 -rw-r--r-- 2 guest guest 0 Dec  7 00:00 b
26020 -rw-r--r-- 1 guest guest 0 Dec  7 00:00 c
26025 -rw-r--r-- 1 guest guest 0 Dec  7 00:00 d

guest@porteus:~$ cp -au /tmp/src/* dst
guest@porteus:~$ ls -il dst
total 0
26026 -rw-r--r-- 3 guest guest 0 Dec  7 00:00 a
26026 -rw-r--r-- 3 guest guest 0 Dec  7 00:00 b
26026 -rw-r--r-- 3 guest guest 0 Dec  7 00:00 c
26034 -rw-r--r-- 1 guest guest 0 Dec  7 00:00 d

Extract from this manual entry for cp:

  

-u, - 仅当SOURCE文件较新时才更新                                    比目标文件或当                                    目标文件丢失

目标目录dst中的文件a,b,c,d不应该被触摸,因为它们的时间戳不能比src中的源等效时间旧。但是dst / b已被触及,在这个基本示例中, cp 不符合更新规范。

到目前为止,我能想到进行复制更新并保留目标目录硬链接结构的唯一方法如下:

  1. 递归地压缩目标目录
  2. 如果找到包含链接的文件,请针对最初为空的已处理inode数组检查inode。
  3. 如果在已处理的inode数组中找不到inode匹配项,请搜索具有相同inode的所有其他文件。
  4. 在具有相同inode的文件中,确定最旧的文件是原始链接。
  5. 比较源目录中相同路径的文件。如果找到,请使用 cp -up
  6. 将源文件复制到目标
  7. 如果inode现在不同,则将具有相同原始inode的所有其他文件链接到更新的文件。
  8. 无论是否更新了带链接的文件,还是不将其inode输入到已处理的inode数组中。
  9. 重复步骤2到7,直到找不到包含未处理链接的文件。
  10. 如果目标文件不存在,或者没有链接,则使用 cp -up 递归邮寄源目录,忽略目标目录中包含链接的文件。

1 个答案:

答案 0 :(得分:0)

  

目标目录dst中的文件a,b,c,d不应该有   被触动了,因为他们的时间戳不可能比他们的年龄大   它们在src中的源代码。然而,dst / b已被触及,并且   在这个基本示例中,cp不符合更新规范。

观察到的行为与更新规范不冲突,因为手册中说-u仅在... 时复制,文件b尚未已复制,但已被关联cp-d暗示选项-a而必须执行此操作。 (请记住保留在这里意味着保留源的属性,而不是目标的属性。)

  

到目前为止,我能想到进行复制更新的唯一方法   保留目标目录的硬链接结构如下:   ...

如果你想保留目标的硬链接结构,只需要使用选项-d,但是e。 G。 cp -pRu …