我正在尝试将最新的文件和目录从一个位置复制到另一个位置。我正在使用带有参考文件的 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