Copiar com a localização cria arquivos duplicados

2

Estou tentando copiar os arquivos e diretórios mais recentes de um local para outro. Estou usando o comando find com um arquivo de referência. Quaisquer arquivos mais novos que o arquivo de referência são copiados.

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

O problema é que se o / root / test / BACKUP / possuir um subdiretório, ele será copiado separadamente, além de ser copiado como um subdiretório. Isso cria arquivos duplicados no destino.

[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
    
por Geeshan 12.02.2017 / 23:25

1 resposta

1

Se você estiver em um Linux não integrado, ou mais geralmente, se o comando cp for do GNU coreutils, você poderá usar cp -u para copiar somente os arquivos mais recentes que o destino. Se você ainda não tem arquivos em /root/test/backup_170213_0328 que são mais recentes que os arquivos em /root/test/BACKUP/ , isso é equivalente ao que você está fazendo agora, exceto que os arquivos não serão copiados duas vezes.

Você também deve passar a opção -p para cp . Na maioria das vezes, e especialmente ao fazer backups, você deve preservar as permissões. E você deve passar -d se quiser copiar links simbólicos como tal, em vez de copiar seus alvos. -rdp pode ser abreviado como -a .

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

No entanto, não está claro para mim por que você deseja copiar uma árvore de diretórios inteira se a raiz tiver sido modificada. Por exemplo, criar um arquivo diretamente sob /root/test/BACKUP faria com que toda a árvore fosse copiada. Você provavelmente não deve copiar diretórios.

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

Além disso, todos os arquivos são copiados no diretório raiz, em vez de reproduzir a árvore de diretórios. Você pode consertar isso usando uma ferramenta cuja finalidade principal é copiar as árvores de diretórios, em vez de uma ferramenta cuja finalidade principal é copiar arquivos individuais. Por exemplo, com pax :

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

Ou com o rsync:

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

Mas se você quiser fazer backups incrementais, eu suspeito que o que você realmente quer é o --link-dest do rsync. Apontar para o seu backup anterior, e ele fará um backup onde os arquivos que já existiam estão com hard-link para o backup anterior.

rsync -a --link-dest=/root/test/backup_170213_0228 /root/test/BACKUP /root/test/backup_170213_0328
    
por 12.02.2017 / 23:38

Tags