如何仅同步与模式匹配的较新(非新)文件

如何仅同步与模式匹配的较新(非新)文件

我试图让 rsync 仅复制比目标本地目录上的匹配项更新的 *.ko 文件。我正在使用 --update 但似乎 rsync 仍然想要复制与目标相同的文件。我正在使用这个命令:

rsync -avmR --dry-run --update --include='*.ko' --include='*/'  --exclude='*' drivers/gpu/ /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/

我在构建 Linux 内核后运行此命令。此构建在几个子目录中创建了一堆 .ko 文件。例如,这是一个子集:

$ find drivers/gpu/ -name "*.ko"
drivers/gpu/drm/amd/amdgpu/amdgpu.ko
drivers/gpu/drm/display/drm_display_helper.ko
drivers/gpu/drm/drm_vram_helper.ko
drivers/gpu/drm/hyperv/hyperv_drm.ko
drivers/gpu/drm/i915/i915.ko

我想要的是复制所有较新的.ko 文件复制到 /lib/modules/6.1.0-rc2+/kernel/drivers/ 下的目标路径。也就是说,只有在以下情况下才应复制 .ko 文件:存在在目标上本地版本是较新的按创建日期比匹配的目标文件。

例如,如果 /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/drm/i915/i915.ko 存在并且 drivers/gpu/drm/i915/i915.ko 较新 /lib/modules/6.1 .0-rc2+/kernel/drivers/gpu/drm/i915/i915.ko,然后将 drivers/gpu/drm/i915/i915.ko 复制到 /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/ drm/i915/i915.ko。

问题是,当我运行上面的 rsync 命令时,它显示的 .ko 文件是不是比他们的目标更新。例如,在这里您可以看到两个目录中的 virtio-gpu.ko 已经是同一个文件:

$ ls -l drivers/gpu/drm/virtio/virtio-gpu.ko /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/drm/virtio/virtio-gpu.ko
-rw-r--r--  1 ttabi ttabi 4992944 Jan 17 13:36 drivers/gpu/drm/virtio/virtio-gpu.ko
-rw-r--r--. 1 ttabi ttabi 4992944 Jan 17 13:36 /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/drm/virtio/virtio-gpu.ko

但是,上面的 rsync 命令显示:

$ rsync -avmR --dry-run --update --include='*.ko' --include='*/'  --exclude='*' drivers/gpu/ /lib/modules/6.1.0-rc2+/kernel/drivers/gpu/
building file list ... done
drivers/
drivers/gpu/
drivers/gpu/drm/
...
drivers/gpu/drm/virtio/
drivers/gpu/drm/virtio/virtio-gpu.ko

这告诉我,如果我删除 --dry-run,rsync 将不必要地文件 virtio-gpu.ko 的副本。

我该如何解决?

答案1

R命令选项中的 是相对路径,我认为这意味着相对于调用命令的位置。

首先复制的是drivers目录。我认为这正在被复制到/lib/modules/6.1.0-rc2+/kernel/drivers/gpu/.

这意味着drivers/gpu/drm/virtio/virtio-gpu.ko正在复制的文件正在被复制到/lib/modules/6.1.0-rc2+/kernel/drivers/gpu/drivers/gpu/drm/virtio/virtio-gpu.ko(注意加倍的drivers/gpu)。

我会尝试不使用相对路径,如果您不想rsync复制目标中尚不存在的文件,请使用--existing跳过创建新文件。

相关内容