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 n
de rsync en el shellscript y ejecútelo o desde el archivo command
y 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.
- Utilice el
find
comando para buscar archivos que le interesen. - Póngalos
dirname
para imprimir el nombre del directorio en el que está almacenado el archivo. - Úselo
uniq
para que en el directorio aparezcan solo aquellos - 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