Rsync todos los directorios que contienen un archivo específico

Rsync todos los directorios que contienen un archivo específico

Estoy trabajando en un clúster que requiere clave pública y contraseña, tengo una estructura de archivos compleja para organizar mi trabajo en este clúster y me gustaría tener una copia de seguridad en mi máquina local de solo algunos directorios.

Me gustaría que rsync obtenga solo directorios que tengan un archivo llamado "copia de seguridad". Ejemplo:

data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up

Debido a este tema de la contraseña, me gustaría evitar cualquier script que llame a ssh varias veces. ¿Existe algún filtro avanzado capaz de hacer eso con rsync?

Respuesta1

Si la cantidad de directorios para respaldar no es demasiado grande, puede colocarlos en la línea de comando usando un shellscript de bash. El siguiente shellscript es una demostración.

Estructura de directorios

$ tree data
data
└── sub1
    ├── sub1_1
    │   ├── a
    │   ├── b
    │   └── backup
    ├── sub1_2
    │   └── c
    └── sub1_3
        ├── backup
        └── d

4 directories, 6 files

Shellscriptrsyncer

#!/bin/bash

echo -n 'rsync -avn ' > command
find . -name 'backup' -type f | sed -e 's%/backup%%' -e 's%.*%"&"%' | tr '\n' ' ' >> command
echo ' target/' >> command

bash command

Ejecución en seco

$ ./rsyncer 
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d

sent 199 bytes  received 64 bytes  526.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Tenga en cuenta que sub1/sub1_2y el archivoCno están listados.

Respaldo

Elimine la opción nde rsync en el shellscript y ejecútelo o desde el archivo commandy ejecútelo,

sed 's/-avn/-av/' command > buper

$ bash buper
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d

sent 383 bytes  received 148 bytes  1,062.00 bytes/sec
total size is 0  speedup is 0.00

$ tree target
target
├── sub1_1
│   ├── a
│   ├── b
│   └── backup
└── sub1_3
    ├── backup
    └── d

2 directories, 5 files

Tenga en cuenta que sub1/sub1_2y el archivoCno están listados.

Respuesta2

Quizás te vendría bien algo parecido.

  1. Utilice el findcomando para buscar archivos que le interesen.
  2. Póngalos dirnamepara imprimir el nombre del directorio en el que está almacenado el archivo.
  3. Úselo uniqpara que en el directorio aparezcan solo aquellos
  4. Itere el resultado en rsync o júntelos para que rsync se invoque solo una vez.

Guión sencillo:

for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
  echo "here: $i"
  # here goes rsync
done

información relacionada