Como posso recursivamente copiar um diretório para outro e substituir apenas os arquivos que não foram alterados?

StackOverflow https://stackoverflow.com/questions/601247

Pergunta

Eu estou olhando para fazer uma cópia específica no Fedora.

Eu tenho duas pastas:

  • 'webroot': realização de todos os arquivos da web / imagens etc

  • 'exportação':. Pasta que contém milhares de PHP, CSS, documentos JS que são exportados do meu SVN repo

O diretório de exportação contém muitos dos mesmos arquivos / pastas que a raiz faz, no entanto, a raiz contém os adicionais não encontrados na exportação.

Eu gostaria de mesclar todas as conteúdo de exportação com a minha webroot com as seguintes opções:

  1. substituindo o arquivo no webroot se a versão de exportação contém código diferente do que está dentro da versão de webroot (live)
  2. Preservar as permissões / usuários / grupos do arquivo se ele será substituído (a exportação versão substituindo a versão ao vivo) * NOTA gostaria que o webroots permissões / propriedade mantido, mas com conteúdo de exportação
  3. Sem avisar / parar da cópia de qualquer tipo (ou seja, não detalhado)
  4. copiar
  5. recursiva - obviamente I gostaria de copiar todos os arquivos * pastas e subpastas encontrado em exportação

Eu fiz um pouco de investigação sobre cp - seria este fazer o trabalho ?:

cp -pruf ./export /path/to/webroot
Foi útil?

Solução

Pode ser, mas a qualquer momento os arquivos correspondentes em export e webroot têm o mesmo conteúdo, mas diferentes tempos de modificação, você ia acabar realizando uma operação de cópia desnecessários. Você provavelmente terá um comportamento ligeiramente mais esperto do rsync:

rsync -pr ./export /path/to/webroot

Além disso, rsync pode copiar arquivos de um host para outro através de uma conexão SSH, se você tiver a necessidade de fazer isso. Além disso, tem uma opções zilhão você pode especificar para ajustar seu comportamento -. Olhada na página man para mais detalhes

Editar : em relação ao seu esclarecimento sobre o que você quer dizer com preservando permissões:. Você provavelmente iria querer deixar de fora a opção -p

Outras dicas

  1. -u substitui arquivos existentes pasta se o destino é mais velho do que fonte
  2. perserves -p a permissão e as datas
  3. voltas -f fora verbosidade
  4. -r torna a cópia recursiva

Assim, parece que você tem todos os argumentos corretos para cp

soa como um trabalho para cpio (e, portanto, provavelmente, GNU tar pode fazer isso também):

cd export
find . -print | cpio -pvdm /path/to/webroot

Se precisar proprietários preservadas, você tem que fazê-lo como root, é claro. A opção -p é 'modo pass', ou seja, cópia entre locais; -v é verboso (mas não interativa; há uma diferença); meios -d criar diretórios como necessário; meios -m preservar o tempo de modificação. Por padrão, sem a opção -u, cpio vai arquivos não substituir na área alvo que são mais recentes do que a da área de origem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top