
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 --delete
a rsync
si desea que los archivos en el destino se eliminen cuando ya no estén presentes en el origen.
Respuesta2
Cree el siguiente bash
script, 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.rules
en 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 rsync
los directorios usando un filtro de combinación.
Respuesta3
La --existing
bandera 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.