Copie a pasta inteira da origem para o destino e remova arquivos ou pastas extras do destino

0

Eu preciso copiar todos os arquivos e diretórios da origem, digamos /var/www/html/test/ para destination /var/www/html/test2/ . O destino já pode ter arquivos e pastas extras que eu preciso remover depois de copiar os arquivos da fonte.

Não consigo excluir tudo do destino antes de copiá-lo.

UPDATE

Eu tentei seguir:

1) Copiou o arquivo da origem para o destino usando o comando cp

cp -R source destination

que funciona bem.

2) Eu tentei iterar todos os arquivos no arquivo de destino para verificar se o arquivo existe na fonte. Se não remover o arquivo do destino

for file in /var/www/html/test2/*; 
  do filestr='basename $file';echo $file; 
  if [ 'ls /var/www/test1/ | grep -c $filestr' -eq 0 ]; 
 then rm $file; fi; 
done;

que funciona bem apenas para os arquivos raiz no destino.

Precisa descobrir como recursivamente verificar todos os arquivos e diretórios correspondentes com a fonte ou não.

    
por Vishnu Sharma 12.07.2017 / 09:23

2 respostas

1
#!/bin/bash

SOURCE="/var/www/html/test/"
DESTINATION="/var/www/html/test2/"

cp -pRu "$SOURCE*" "$DESTINATION"

HITSDIR='find $DESTINATION -type d | sed -e 's|'$DESTINATION'\(.*\)||g''

for i in $HITSDIR; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm -r $DESTINATION$i
fi
done

HITSFILES='find $DESTINATION -type f | sed -e 's|'$DESTINATION'\(.*\)||g''

for i in $HITSFILES; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm $DESTINATION$i
fi
done

Isso deve fazer o que você quer, apenas descomente o rm uma vez que você fez uma corrida seca.

    
por 12.07.2017 / 09:37
3

Este é um caso de uso clássico para rsync . rsync copia uma árvore de diretórios da origem para o destino. Também pode ser solicitado que exclua o excesso de outros arquivos após a cópia:

rsync -a -v --delete-after /var/www/html/test/ /var/www/html/test2  

Observe o / à direita na especificação de origem. Se você omitir isso, copiará o próprio diretório de origem, o que você não desejará.

Se você quiser quieto, remova o -v . Se os arquivos são grandes e compressíveis, você pode tentar adicionar -z para fazer compressão e descompressão, mas duvido que vá ganhar muito. A opção --delete-after apaga apenas os arquivos e pastas excedentes do destino, mas não antes de após os outros arquivos terem sido copiados.

Um bônus de usar rsync é que ele não se importará em copiar arquivos que são os mesmos (ou seja, que já estão lá e que realmente correspondem).

    
por 12.07.2017 / 10:03