rsync --delete hat die meisten Dateien im Zielverzeichnis gelöscht, warum?

rsync --delete hat die meisten Dateien im Zielverzeichnis gelöscht, warum?

Meine Konfigurationsdateien im /etcOrdner sind völlig durcheinander, weil ich bei der Ausführung von rsync nicht auf die Shell-Erweiterung geachtet habe:

rsync --progress --delete -avhHe ssh /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

Ich denke, das Problem besteht darin, dass der „.“ nach logrotate erweitert wurde und in der Folge einige Ordner, wie z. B., /etc/httpdgelöscht wurden.

Ich möchte aus diesem Fehler lernen, indem ich es richtig mache. Wie verhindere ich die Shell-Erweiterung, wenn ich mehrere Dateien mit SSH synchronisiere?

Antwort1

Dieser Befehl lässt sich im Wesentlichen wie folgt zusammenfassen:

rsync --delete --recursive /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

Das .„in“ hat seine wörtliche Bedeutung – es ist Teil des Namens – also ist das nicht das Problem. Der Teil „in“ {}unterliegtKlammererweiterung: Jeder durch Kommas getrennte Teil wird erweitert und mit dem Teil des Arguments verknüpft, der vor ( /etc/logrotate.d/) stand. (Es würde auch alles danach erhalten, wenn da etwas stünde: a{BC}dwird zu erweitert aBd aCd).

Dieser Befehl ist also gleichbedeutend mit

rsync --delete --recursive /etc/logrotate.d/httpd /etc/logrotate.d/mariadb /etc/logrotate.d/php-fpm /etc/logrotate.d/ppp /etc/logrotate.d/wpa_supplicant /etc/logrotate.d/yum [email protected]:/etc

oder wähle nur ein Verzeichnis aus, damit es kurz ist:

rsync --delete --recursive /etc/logrotate.d/httpd [email protected]:/etc

rsync interpretiert den "From"-Speicherort als eine einzelne Entität, und wenn esnichtEndet mit einem , /erstellt es eine neue Datei oder ein neues Verzeichnis mit nur dem letzten Teil dieses Namens innerhalb des angegebenen Zielpfads: hier ist das httpd. Dies erstellt also ein /etc/httpdam Ziel und kopiert den Inhalt von /etc/logrotate.d/httpdhinein.

Mit --deletewird es dannalles löschenDaswar nichtin /etc/logrotate.d/httpdder Quelle. Das Problem— da /etc/logrotate.d/httpdes wahrscheinlich gar nicht existiert, bedeutet das Kopieren und Löschen aller Dateien, die nicht in der Quelle vorhanden warenalles in all diesen Verzeichnissen löschen. Wenn es existierte, ist sein Inhalt nicht derselbe wie /etc/httpd, daher wird (fast) alles gelöscht.

Das Problem ist also, dass Sie den logrotate.dTeil überhaupt dort haben, obwohl Sie eigentlich die gleichen Verzeichnisse unter kopieren wollten /etc. Was Sie wahrscheinlich gemeint haben, war nur:

rsync --progress --delete -avhHe ssh /etc/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

Dadurch werden /etc/httpddie Inhalte in /etc/httpddas Ziel kopiert usw. Wenn Sie Dinge darin kopieren möchten logrotate.d, fügen Sie diese auf beiden Seiten in den Pfad ein.

Eine Sache, die Sie vielleicht nützlich finden, ist die-noder --dry-runOptionZu rsync:

-n, --dry-run führt einen Probelauf ohne Änderungen durch

Dadurch wird eine Vorschau dessen angezeigt, was passieren würde, aber es werden an keiner Stelle tatsächlich Änderungen vorgenommen. Sie können dies verwenden, um zu überprüfen, ob es das ist, was Sie möchten, bevor Sie die eigentliche Sache ausführen.


Sie haben gefragt, wie Sie die Shell-Erweiterung in den Argumenten verhindern können, die Sie angegeben haben rsync. Wie oben denke ich nicht, dass das angesichts Ihres Problems wirklich das ist, was Sie wollen, aber falls es jemals nötig sein sollte: Klammererweiterungen finden nicht innerhalb von Anführungszeichen statt, "a{BC}d"bleiben also a{BC}dwörtlich.

verwandte Informationen