최신 파일과 디렉터리를 한 위치에서 다른 위치로 복사하려고 합니다. 참조 파일과 함께 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를 사용하는 경우 또는 보다 일반적으로 명령이 GNU coreutils에서 제공되는 경우 을 사용하여 대상보다 최신 파일만 복사 cp
할 수 있습니다 . 아래의 파일이 아래의 파일보다 최신이 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