Ich arbeite an einem Cluster, der sowohl einen öffentlichen Schlüssel als auch ein Kennwort erfordert. Ich verfüge über eine komplexe Dateistruktur, um meine Arbeit an diesem Cluster zu organisieren, und ich möchte auf meinem lokalen Computer nur von einigen Verzeichnissen ein Backup haben.
Ich möchte, dass rsync nur Verzeichnisse abruft, die eine Datei mit dem Namen „backup“ haben. Beispiel:
data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up
Wegen der Sache mit dem Passwort möchte ich jedes Skript vermeiden, das SSH mehrere Male aufruft. Gibt es einen erweiterten Filter, der dies mit rsync ermöglicht?
Antwort1
Wenn die Anzahl der zu sichernden Verzeichnisse nicht zu groß ist, können Sie diese mit einem Bash-Shellskript in die Kommandozeile eingeben. Das folgende Shellskript ist eine Demo.
Verzeichnisaufbau
$ tree data
data
└── sub1
├── sub1_1
│ ├── a
│ ├── b
│ └── backup
├── sub1_2
│ └── c
└── sub1_3
├── backup
└── d
4 directories, 6 files
Shell-Skriptrsyncer
#!/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
Probelauf
$ ./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)
Bitte beachten Sie, dass sub1/sub1_2und die DateiCsind nicht aufgeführt.
Sicherung
Entfernen Sie die Option n
aus rsync im Shellscript und führen Sie es aus oder aus der Datei command
und führen Sie es aus.
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
Bitte beachten Sie, dass sub1/sub1_2und die DateiCsind nicht aufgeführt.
Antwort2
Vielleicht könntest Du so etwas gebrauchen.
- Verwenden Sie den
find
Befehl, um die Dateien zu finden, die Sie interessieren. - Lassen Sie sie durch,
dirname
um den Namen des Verzeichnisses auszudrucken, in dem die Datei gespeichert ist. - Verwenden Sie
uniq
so das Verzeichnis wird nur diejenigen aufgelistet, - Iterieren Sie über das Ergebnis in rsync oder fügen Sie sie zusammen, sodass rsync nur einmal aufgerufen wird.
Einfaches Skript:
for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
echo "here: $i"
# here goes rsync
done