rsync solo subdirectorios existentes en el destino

rsync solo subdirectorios existentes en el destino

Tengo dos directorios en los que necesito sincronizar el contenido de solo los subdirectorios que ya están presentes en el directorio de destino. Por ejemplo:

Directorio de origen:

  • carpeta A
  • carpeta B
  • carpeta C
  • carpeta D
  • carpeta E

Directorio de destino:

  • carpeta B
  • carpeta D
  • carpeta Z

Necesito sincronizar el único contenido de las carpetas B y D desde el origen al destino (y la carpeta Z no existe en el origen, por lo que debe ignorarse). Del mismo modo, no necesito que el directorio de destino tenga copiadas las carpetas A, C y E.

Básicamente, "Para todos los subdirectorios en el destino, si existe el mismo subdirectorio en el origen, sincronice el contenido de ese subdirectorio desde el origen".

Si le ayuda, todos estos son directorios locales.

Ojalá eso tenga sentido. ¡Gracias por la ayuda!

Respuesta1

Podrías usar un script como este.

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

Si es independiente, no necesita los ( ... )corchetes ya que solo existen para localizar el cambio de directorio.

Agregue --deletea rsyncsi desea que los archivos en el destino se eliminen cuando ya no estén presentes en el origen.

Respuesta2

Cree el siguiente bashscript, cambie las rutas al directorio de origen y de destino y ejecútelo.

#!/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"

Esto crearía un archivo filter.rulesen el directorio fuente con el siguiente contenido:

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

La primera línea + /folder B/***es la sintaxis corta para

  • + /folder B/incluir el directorio
  • + /folder B/**incluir archivos y subdirectorios

y - *excluye archivos y directorios en la raíz.

Si las reglas tienen el aspecto esperado, descomente la última línea y ejecute el script nuevamente en rsynclos directorios usando un filtro de combinación.

Respuesta3

La --existingbandera es lo que estás buscando. Desde la 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.

información relacionada