staging.inyokaproject.org

rsync und --delete

Status: Gelöst | Ubuntu-Version: Ubuntu 21.10 (Impish Indri)
Antworten |

Mister.X

Anmeldungsdatum:
15. Februar 2022

Beiträge: Zähle...

Hallo!

Ich möchte mit rsync nur Odner zum Ziel synchronisieren, die aus 8 Zahlen bestehen und nur PDF-Dateien. Mit dem folgenden Skript haut es zwar hin, dass alles wunschgemäß zum Ziel kopiert wird. Lösche ich aber Dateien und/oder Ordner, so werden diese nicht am Ziel gelöscht.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# debug var, set true for console msg
debug=false

# vars, change if needed
basepath=/root/temp/quelle/
target=/root/temp/ziel/
IncExFiles=/root/temp/

# don't change !
includeFiles="${IncExFiles}includeFiles"
excludeFiles="${IncExFiles}excludeFiles"

# switch to base path
cd $basepath
# find files to include (only dirs with 8 digits) and all PDF files
find . -type f -regextype sed -regex '.*/[0-9]\{8\}/.*\.pdf' | cut -sd / -f 2- > $includeFiles
# find files to exclude (no folder with archiv in it's name!)
find . -type f -regextype sed -regex '.*[Aa]rchiv.*' | cut -sd / -f 2- > $excludeFiles

# copy files to target
rsync -azsb --iconv='UTF-8' --delete --backup-dir=/root/temp/backup --exclude-from=$excludeFiles --files-from=$includeFiles $basepath $target

Wie muss ich das Skript anpassen?

Bearbeitet von tuxifreund:

Aus dem Spamfilter gefischt

Moderiert von sebix:

Thema in einen passenden Forenbereich verschoben. Bitte beachte die als wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“) in jedem Forenbereich. Danke.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Hm, also das --delete wirkt laut Manpage wohl nur bei Verzeichnissen:

       --delete
              This tells rsync to delete extraneous files from the receiving side (ones that aren’t on the sending side), but only for the directories that are being synchronized.  You must have asked rsync to send the whole directory (e.g. "dir" or "dir/") without using a wildcard for the directory’s contents (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus gets a request  to  transfer  individual  files, not the files’ parent directory.

Mister.X

(Themenstarter)

Anmeldungsdatum:
15. Februar 2022

Beiträge: Zähle...

Ja, aber auch die Verzeichnisse werden nicht gelöscht. Hier einmal ein Auszug, was in den Dateien includeFiles oder exkludeFiles steht:

12345678/12345678.pdf

Da es kein kompletter Pfad ist, könnte daher der Fehler darin liegen, dass es ausgehend vom Skript nur ein relativer Pfad ist. Oder liege ich da falsch? Ich müsste es mal ausprobieren.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

rsync sieht Dateien nur dann als fehlend an, wenn rsync selbst den Verzeichnisinhalt durchgeht und somit selbst feststellt, welche Dateien gar nicht mehr da sind.

Aber bei dir geht nicht rsync, sondern find den Verzeichnisinhalt durch. rsync sieht nur noch die vorgefilterte Dateiliste.

Nach deinem Beispiel würde rsync -a --delete datei.pdf verzeichnis/ die datei.pdf ins Verzeichnis kopieren und alle anderen Dateien im Verzeichnis löschen, da ja nur datei.pdf angegeben wurde. Das würde --delete noch gefährlicher machen als es ohnehin schon ist, das Verhalten ist so einfach nicht gewollt.

rsync macht diese Löschung nur wenn ein Quellverzeichnis angegeben wurde in dem datei.pdf und sonst nichts drin war. Dann wird es so kopiert daß im Ziel auch nur noch die datei.pdf in diesem Verzeichnis ist. Das ist dann ein Abgleich der Verzeichnisstruktur und wenn rsync dann zuviel gelöscht hat, dann halt weils auf der Quelle auch so war.

rsync hat seine eigenen Optionen für include exclude Filter, vielleicht kannst du die verwenden und brauchst somit das separate find gar nicht mehr. ( include from statt files from aber da musst du umstrukturieren )

Ansonsten würde ich empfehlen, das Quellverzeichnis direkt so anzulegen, daß nur die gewünschten Inhalte sich darin befinden und die Filterung somit obsolet wird.

Oder du findest einen Weg ohne --delete auszukommen bzw. die überschüssigen Dateien selbst zu löschen.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

Andere Möglichkeit, dein find aufs target anwenden und dann mit --delete-missing-args würde rsync dann die Dateien löschen die im Source fehlen.


Auf Stackoverflow ist noch ein interessanter Lösungsansatz: https://stackoverflow.com/q/1813907

Dort wird ein neues/leeres Zielverzeichnis erstellt mit Hardlinks zum bestehenden Verzeichnis. Das neue Verzeichnis hat dann nur die gewünschten Dateien. Dann kann man entweder das alte Verzeichnis löschen/umbenennen (für Backup) oder das neue Verzeichnis als Referenz für --delete in einem zweiten Durchgang hernehmen.

Ob diese Lösung funktioniert habe ich jetzt aber nicht selbst ausprobiert. 😅

Mister.X

(Themenstarter)

Anmeldungsdatum:
15. Februar 2022

Beiträge: 7

frostschutz schrieb:

rsync sieht Dateien nur dann als fehlend an, wenn rsync selbst den Verzeichnisinhalt durchgeht und somit selbst feststellt, welche Dateien gar nicht mehr da sind.

Aber bei dir geht nicht rsync, sondern find den Verzeichnisinhalt durch. rsync sieht nur noch die vorgefilterte Dateiliste.

Nach deinem Beispiel würde rsync -a --delete datei.pdf verzeichnis/ die datei.pdf ins Verzeichnis kopieren und alle anderen Dateien im Verzeichnis löschen, da ja nur datei.pdf angegeben wurde. Das würde --delete noch gefährlicher machen als es ohnehin schon ist, das Verhalten ist so einfach nicht gewollt.

rsync macht diese Löschung nur wenn ein Quellverzeichnis angegeben wurde in dem datei.pdf und sonst nichts drin war. Dann wird es so kopiert daß im Ziel auch nur noch die datei.pdf in diesem Verzeichnis ist. Das ist dann ein Abgleich der Verzeichnisstruktur und wenn rsync dann zuviel gelöscht hat, dann halt weils auf der Quelle auch so war.

rsync hat seine eigenen Optionen für include exclude Filter, vielleicht kannst du die verwenden und brauchst somit das separate find gar nicht mehr. ( include from statt files from aber da musst du umstrukturieren )

Ansonsten würde ich empfehlen, das Quellverzeichnis direkt so anzulegen, daß nur die gewünschten Inhalte sich darin befinden und die Filterung somit obsolet wird.

Oder du findest einen Weg ohne --delete auszukommen bzw. die überschüssigen Dateien selbst zu löschen.

Das verstehe ich jetzt nicht. Ich arbeite beim rsync doch mit den Optionen exclude-from und include-from. find sucht doch nur die Ordner und Dateien, die synchronisiert werden sollen. Beindungen sind:

  • Synchronsiere alle Ordner, die nur aus acht Zahlen bestehen.

  • Synchronisiere alle PDF-Dateien.

Wie muss ich sonst rsync mit "hausinternen Optionen" nutzen, damit er genau das macht? Zusätzlich eben die Dateien und Ordner am Ziel löschen, die auch in der Quelle gelöscht wurden.

Mister.X

(Themenstarter)

Anmeldungsdatum:
15. Februar 2022

Beiträge: 7

Schade! Kann hier niemand weiterhelfen? Ich bekomme es mit rsync leider nicht hin. Das Teil hat irgendwie seine eigene Logik.

san04

Anmeldungsdatum:
19. Januar 2010

Beiträge: 1268

Kannst du das mal probieren?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# debug var, set true for console msg
debug=false

# vars, change if needed
basepath=/root/temp/quelle/
target=/root/temp/ziel/
IncExFiles=/root/temp/

# don't change !
includeFiles="${IncExFiles}includeFiles"
excludeFiles="${IncExFiles}excludeFiles"

# switch to base path
cd $basepath
# find files to include (only dirs with 8 digits) and all PDF files
find . -type f -regextype sed -regex '.*/[0-9]\{8\}/.*\.pdf' | cut -sd / -f 2- | awk '{print "+ "$0}' > $includeFiles
echo "+ */" >> $includeFiles
echo "- *" >> $includeFiles

# find files to exclude (no folder with archiv in it's name!)
find . -type f -regextype sed -regex '.*[Aa]rchiv.*' | cut -sd / -f 2- > $excludeFiles

# copy files to target
rsync -azsb --iconv='UTF-8' --delete-excluded --backup-dir=/tmp/backup --exclude-from=$excludeFiles --include-from=$includeFiles --prune-empty-dirs $basepath $target

Mister.X

(Themenstarter)

Anmeldungsdatum:
15. Februar 2022

Beiträge: 7

Wow, super! Ich bin begeistert!

Läuft einwandfrei. Vielen Dank für die Unterstützung!

san04

Anmeldungsdatum:
19. Januar 2010

Beiträge: 1268

frostschutz hatte ja schon den Schubs in die richtige Richtung gegeben 😉

Die PDFs im Wurzelverzeichnis werden nicht gesichert, aber das ist offenbar gewünscht?

Und deine regex hat einen Stern vorweg, also werden nicht nur Ordner 12345678, sondern auch Ordner mit "prefix" abcd12345678 gesichert. Auch das ist beabsichtigt, oder?

Mister.X

(Themenstarter)

Anmeldungsdatum:
15. Februar 2022

Beiträge: 7

Ja, das ist soweit in Ordnung. Bei den Ordnern kann es sein, dass es mal einen gibt, wo ein bis drei führende Buchstaben existieren.

Danke nochmals!

Antworten |