
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 --delete
a rsync
se desejar que os arquivos no destino sejam removidos quando não estiverem mais presentes na origem.
Responder2
Crie o bash
script 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.rules
no 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 rsync
diretórios usando um filtro de mesclagem.
Responder3
A --existing
bandeira é 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.