rsync apenas subdiretórios existentes no destino

rsync apenas subdiretórios existentes no destino

Eu tenho dois diretórios que preciso sincronizar novamente o conteúdo apenas dos subdiretórios que já estão presentes no diretório de destino. Por exemplo:

Diretório de origem:

  • pasta A
  • pasta B
  • pasta C
  • pasta D
  • pasta E

Diretório de destino:

  • pasta B
  • pasta D
  • pasta Z

Preciso sincronizar novamente o único conteúdo das pastas B e da pasta D da origem para o destino (e a pasta Z não existe na origem, portanto deve ser ignorada). Da mesma forma, não preciso que o diretório de destino tenha as pastas A, C e E copiadas para ele.

Essencialmente, um "Para todos os subdiretórios no destino, se o mesmo subdiretório existir na origem, sincronize novamente o conteúdo desse subdiretório da origem".

Se ajudar, todos esses são diretórios locais.

Espero que isso faça sentido. Obrigado pela ajuda!

Responder1

Você poderia usar um script como este.

(
    cd destination &&
        for d in *
        do
            [ -d "$d" -a -d source/"$d" ] && rsync -a source/"$d" .
        done
)

Se for independente, você não precisa dos ( ... )colchetes, pois eles existem apenas para localizar a mudança de diretório.

Adicione --deletea rsyncse desejar que os arquivos no destino sejam removidos quando não estiverem mais presentes na origem.

Responder2

Crie o bashscript a seguir, altere os caminhos para o diretório de origem e destino e execute-o.

#!/bin/bash

source=/path_to/source_dir
destination=/path_to/destination_dir

shopt -s nullglob
{
  for dir in "$destination/"*/; do
    dirname=$(basename "$dir")
    if [ -d "$source/$dirname" ]; then
      printf '+ /%s/***\n' "$dirname"
    fi
  done
  printf -- '- *\n'
} > "$source/filter.rules"

#rsync -av --filter="merge $source/filter.rules" "$source"/ "$destination"

Isso criaria um arquivo filter.rulesno diretório de origem com o seguinte conteúdo:

+ /folder B/***
+ /folder D/***
- *

A primeira linha + /folder B/***é a sintaxe curta para

  • + /folder B/inclua o diretório
  • + /folder B/**incluir arquivos e subdiretórios

e - *exclui arquivos e diretórios na raiz.

Se as regras parecerem conforme o esperado, remova o comentário da última linha e execute o script novamente nos rsyncdiretórios usando um filtro de mesclagem.

Responder3

A --existingbandeira é o que você está procurando. Na página de manual:

--existing, --ignore-non-existing

This  tells  rsync  to  skip  creating  files (including 
directories) that do not exist yet on the destination.  If this option is combined 
with the --ignore-existing option, no files will be updated (which can be useful 
if all you want to do is delete extraneous files).

This option is a transfer rule, not an exclude, so it doesn’t affect the data that 
goes into the file-lists, and thus it doesn’t affect deletions.  It just limits 
the files that the  receiver requests to be transferred.

informação relacionada