使用查找复制会创建重复文件

使用查找复制会创建重复文件

我正在尝试将最新的文件和目录从一个位置复制到另一个位置。我正在使用带有参考文件的 find 命令。任何比参考文件新的文件都会被复制。

find  /root/test/BACKUP/   -newer /root/test/BACKUP//reference -exec cp -r  '{}' /root/test/backup_170213_0328 ';'

问题是 /root/test/BACKUP/ 是否有子目录,除了作为子目录复制之外,还需要单独复制这些子目录。这会在目标中创建重复文件。

[root@localhost S3_Backup]# tree /root/test/BACKUP/
/root/test/BACKUP/
├── Chrysanthemum.jpg
├── Desert.jpg
├── Hydrangeas.jpg
├── Jellyfish.jpg
├── level2
│   ├── Lighthouse.jpg
│   ├── Penguins.jpg
│   ├── teddy.jpg
│   └── Tulips.jpg
└── reference

1 directory, 9 files
[root@localhost S3_Backup]# tree /root/test/backup_170213_0328
/root/test/backup_170213_0328
├── BACKUP
│   ├── Chrysanthemum.jpg
│   ├── Desert.jpg
│   ├── Hydrangeas.jpg
│   ├── Jellyfish.jpg
│   ├── level2
│   │   ├── Lighthouse.jpg
│   │   ├── Penguins.jpg
│   │   ├── teddy.jpg
│   │   └── Tulips.jpg
│   └── reference
└── level2
    ├── Lighthouse.jpg
    ├── Penguins.jpg
    ├── teddy.jpg
    └── Tulips.jpg

3 directories, 13 files

答案1

如果您使用的是非嵌入式 Linux,或者更一般地说,如果您的cp命令来自 GNU coreutils,那么您可以用来cp -u仅复制比目标更新的文件。如果您的 下的文件不比/root/test/backup_170213_0328下的文件更新/root/test/BACKUP/,那么这相当于您现在正在做的事情,只是文件不会被复制两次。

您还应该将该-p选项传递给cp.大多数时候,尤其是在进行备份时,您应该保留权限。-d如果您想复制符号链接本身,而不是复制其目标,则应该通过。-rdp可以简写为-a.

find  /root/test/BACKUP/   -newer /root/test/BACKUP//reference -exec cp -a  {} /root/test/backup_170213_0328 ';'

但是,我不清楚如果根目录已被修改,为什么要复制整个目录树。例如,直接在其下创建文件/root/test/BACKUP将导致复制整个树。您可能不应该复制目录。

find  /root/test/BACKUP/ ! -type d -newer /root/test/BACKUP//reference -exec cp -RPp {} /root/test/backup_170213_0328 ';'

此外,所有文件都被复制到根目录下,而不是复制目录树。您可以使用主要目的是复制目录树的工具(而不是主要目的是复制单个文件的工具)来解决此问题。例如,与帕克斯

find  /root/test/BACKUP/ ! -type d -newer /root/test/BACKUP//reference -exec pax -rw -pe {} /root/test/backup_170213_0328 ';'

或者使用 rsync:

find  /root/test/BACKUP/ ! -type d -newer /root/test/BACKUP//reference -exec rsync -a {} /root/test/backup_170213_0328 ';'

但如果你想进行增量备份,我怀疑你真正追求的是 rsync 的--link-dest.将其指向您以前的备份,它将创建一个备份,其中已存在的文件硬链接到以前的备份。

rsync -a --link-dest=/root/test/backup_170213_0228 /root/test/BACKUP /root/test/backup_170213_0328

相关内容