Ich habe ungefähr 50 Dateien in verschiedenen Unterverzeichnissen, die ich auf einen Remote-Server übertragen möchte. Ich dachte, rsync könnte dies mit der Option --include-from für mich tun. Ohne die Option --exclude = "*" werden alle Dateien im Verzeichnis synchronisiert, mit der Option sind keine Dateien vorhanden.
rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run
Ich führe es zunächst als trocken aus und 0.0.0.0 wird offensichtlich durch die IP des Remote-Servers ersetzt. Der Inhalt von rsync_include.txt ist eine neue zeilengetrennte Liste relativer Pfade zu den Dateien, die ich hochladen möchte.
Gibt es einen besseren Weg, der mir an einem Montagmorgen entgeht?
rsync --files-from
wahrscheinlich eine einfachere und zuverlässigere Lösung :)Es gibt eine Flagge
--files-from
, die genau das tut, was Sie wollen. Vonman rsync
:quelle
rsync -av --files-from=file-list . target/
um Dateien aus dem aktuellen Verzeichnis zu kopieren.The filenames that are read from the FILE are all relative to the source dir
...
rsync beginnt, scheint dies zu ignorieren..
, wenn ich einen Fehler wiersync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory
(in diesem Fall aus dem Verzeichnis "test" ausführen und versuchen, "../subdir/test.txt" anzugeben, das vorhanden ist.--files-from
Argument mit einer expliziten Liste von Einschlüssen und--files-from
Ausschlüssen kombiniert werden, und werden die hinzugefügten Dateien aus der Liste mit überschriebenen Ausschlussregeln überschrieben, sodass sie eingeschlossen werden, wenn sie in der Datei erscheinen?--files-from=
Der Parameter benötigt einen abschließenden Schrägstrich, wenn der absolute Pfad intakt bleiben soll. Ihr Befehl würde also wie folgt aussehen:Dies kann so geschehen, als ob es eine große Anzahl von Dateien gibt und Sie alle Dateien in den x-Pfad kopieren möchten. Sie würden also die Dateien finden und die Ausgabe in eine Datei wie die folgende werfen:
quelle
Für die Aufzeichnung half keine der obigen Antworten außer einer. Zusammenfassend können Sie den Sicherungsvorgang folgendermaßen ausführen
--files-from=
:ODER
Der erstere Befehl ist neben dem Inhalt der Datei, auf
rsync-src-files
die ich weiter unten näher eingehen werde, selbsterklärend . Wenn Sie nun die letztere Version verwenden möchten, müssen Sie die folgenden vier Anmerkungen beachten:--files-from
und das Quellverzeichnis--recursive
.rsync-src-files
ist eine vom Benutzer erstellte Datei und wurde für diesen Test im Verzeichnis src abgelegtrsyn-src-files
enthalten die zu kopierenden Dateien und Ordner und werden relativ zum Quellverzeichnis erstellt. WICHTIG: Stellen Sie sicher, dass die Datei keine nachgestellten Leerzeichen oder Leerzeilen enthält. Im folgenden Beispiel gibt es nur zwei Zeilen, nicht drei (zufällig herausfinden). Inhalt vonrsynch-src-files
ist:Ordnername1
Ordnername2
quelle
Ich habe eine ähnliche Aufgabe: alle nach dem angegebenen Datum geänderten Dateien rsync, aber einige Verzeichnisse ausgenommen. Es war schwierig, einen All-in-One-Liner zu bauen, deshalb habe ich das Problem in kleinere Teile zerlegt. Endgültige Lösung:
Zuerst benutze ich
find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"
. Ich habe versucht, eine Zeile hinzuzufügenregex
,find
um Namensmuster auszuschließen, aber mein Geschmack von Linux (Mint) -Nähten, Negativ-Regex nicht zu verstehenfind
. Versuchte Anzahl von Regex-Aromen - funktioniert nicht wie gewünscht. Am Ende habe ichegrep -v
also eine Option, die das Muster auf einfache Weise ausschließt. Myrsync
kopiert keine Verzeichnisse wie /.cache oder /.config sowie einige andere, die ich explizit benannt habe.quelle
bash
rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
Syntax:
rsync <file_/_folder_list> <source> <target>
Ordnernamen (hier MIT einem Trailing
/
; zBCancer - Evolution/
) befinden sich in einer Ordnerlistendatei (zB: cm_folder_list_test):Wenn Sie diese
/
nachfolgenden nicht einschließen , werden die rsync-Zielordner erstellt, sind jedoch leer.Diese Ordnernamen werden an den Rest ihres Pfads (
/home/victoria/Mail/2_RESEARCH - NEWS
) angehängt , wodurch der vollständige Ordnerpfad für rsync bereitgestellt wird. zB :/home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/
.Beachten Sie, dass Sie auch
--files-from=
..., NICHT--include-from=
... verwenden müssen.rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/
(In meinem BASH-Skript habe ich die Variable
$IN
wie folgt definiert .)Verwendete rsync-Optionen:
quelle
Diese Antwort ist nicht die direkte Antwort auf die Frage. Aber es sollte Ihnen helfen, herauszufinden, welche Lösung am besten zu Ihrem Problem passt.
Bei der Analyse des Problems sollten Sie die Debug-Option aktivieren
-vv
Dann gibt rsync aus, welche Dateien von welchem Muster eingeschlossen oder ausgeschlossen werden:
quelle
Keine dieser Antworten funktionierte für mich, als ich nur eine Liste von Verzeichnissen hatte . Dann bin ich auf die Lösung gestoßen! Sie müssen hinzufügen
-r
,--files-from
da-a
dies in diesem Szenario nicht rekursiv ist (wer wusste das?!).quelle