Copie e sobrescreva diretório recursivamente

4

Eu tenho um diretório chamado 'existing_folder' e outro diretório chamado 'temp'

Eu quero substituir o conteúdo de 'existing_folder' por aqueles de 'temp' junto com qualquer subdiretório.

Como o diretório contém páginas da Web, isso deve ser feito de maneira a garantir um tempo de inatividade mínimo.

Existe uma maneira de fazer isso? Que comando devo usar para conseguir isso?

    
por user2028856 22.03.2015 / 08:55

3 respostas

7

Se os dois orig_folder e temp estiverem no mesmo disco rígido físico, renomear (mover) eles é essencialmente instantâneo. Isso significa que você poderia simplesmente fazer

mv orig_folder foo && mv temp orig_folder && rm -rf foo

Isso mudará o nome de orig_folder para foo , renomeará temp para orig_folder e, finalmente, excluirá foo . No mesmo sistema de arquivos, as duas operações mv demoram quase zero (0,004 segundos no meu sistema).

Se os diretórios de origem e de destino não estiverem no mesmo sistema de arquivos, a fim de Para minimizar o tempo de que os arquivos não estão disponíveis, primeiro você precisa mover o diretório de origem para o mesmo sistema de arquivos e, em seguida, renomear:

mv /path/to/temp . && mv orig_folder foo && mv temp orig_folder && rm -rf foo
    
por terdon 22.03.2015 / 12:02
5

Já experimentou rsync ?

De suas necessidades, acho que é a melhor ferramenta. Ele substituirá apenas os arquivos que foram alterados, copiará novos e poderá remover aqueles que não tiverem origem.

$ rsync -av --delete temp/ existing_folder/

Observe que a barra após temp é necessária porque você deseja sincronizar o conteúdo. Sem isso, criaria uma diretriz dentro da pasta existente.

O argumento delete faz com que os arquivos que não estão mais em temp sejam removidos em existing_folder.

Você também pode fazer um dry-run se adicionar um argumento -n. Ele informará quais alterações serão feitas sem fazer nada.

    
por Francesc Guasch 22.03.2015 / 12:09
1

Combinando a resposta aceita aqui com o comando para copiar um diretório para outro, o comando abaixo deve fazer o trabalho:

rm -rfv <existing_folder>/* && cp -r <temp>/* <existing_folder>

Mas, como diz a resposta no link, observe que:

  • a parte /* é muito importante. Se você colocar um espaço antes do * , ele excluirá todos os seus arquivos no diretório atual.
  • isso não excluirá arquivos ocultos
  • "seja muito (muito) cuidadoso ao jogar com rm , -r e * todos no mesmo comando. Eles podem ser uma combinação desastrosa."
por Jacob Vlijm 22.03.2015 / 09:27