Rsync alle Verzeichnisse, die eine bestimmte Datei enthalten

Rsync alle Verzeichnisse, die eine bestimmte Datei enthalten

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 naus rsync im Shellscript und führen Sie es aus oder aus der Datei commandund 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.

  1. Verwenden Sie den findBefehl, um die Dateien zu finden, die Sie interessieren.
  2. Lassen Sie sie durch, dirnameum den Namen des Verzeichnisses auszudrucken, in dem die Datei gespeichert ist.
  3. Verwenden Sie uniqso das Verzeichnis wird nur diejenigen aufgelistet,
  4. 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

verwandte Informationen