복사본 찾기를 사용하면 중복 파일이 생성됩니다.

복사본 찾기를 사용하면 중복 파일이 생성됩니다.

최신 파일과 디렉터리를 한 위치에서 다른 위치로 복사하려고 합니다. 참조 파일과 함께 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

관련 정보