Ich habe eine Textdatei mit einer Liste von Verzeichnissen mit ihrem absoluten Pfad
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Ich möchte rsync verwenden, um alle diese Verzeichnisse zu kopieren und dabei den absoluten Pfad zu einem anderen Speicherort beizubehalten.
Ich habe den folgenden Befehl rsync ausprobiert, aber er funktioniert nicht
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
Was läuft hier falsch?
/data/Dir1
und/data/Dir2
einschließlich ihres Inhalts/media/MyDestination/Dir1
und/media/MyDestination/Dir2
? Oder möchten Sie das/data
Teil einschließen ? Wie groß ist diese Liste, ist sie zu groß, um diese Einträge einfach in der Befehlszeile aufzulisten? Wie auch immer, Ihre--exclude
Aussagen verhindern die Rekursion./media/MyDestination/data/Dir2/
. Ich habe --exclude hinzugefügt, um zu verhindern, dass andere Verzeichnisse und Dateien in / kopiert werden.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Antworten:
Verwenden Sie den folgenden Befehl:
Sie müssen / data / explizit einfügen, das hätten Sie auch der Liste in der Datei hinzufügen können. Schließen Sie dann alle anderen Verzeichnisse aus (die Reihenfolge ist bei Einschlüssen / Ausschlüssen wichtig).
Beachten Sie, dass Ihre Verwendung von
-r
redundant war, da dies in enthalten ist-a
.EDIT: Sie können das gleiche Ergebnis auch erzielen mit:
Es ist nicht rsync, das Sie dazu zwingt, schwierige Dinge zu tun, nur um ein paar Verzeichnisse zu kopieren. Es gibt Ihnen nur mehrere Möglichkeiten, dasselbe zu tun. In einigen Fällen ist es möglicherweise besser, den Einschluss- / Ausschluss-Weg zu wählen. Hier würde ich das - Relative oben tun (ohne dass
--relative
Sie mit/media/MyDestination/Dir1
und enden würden/media/MyDestination/Dir2
, wobei--relative
der gesamte Quellpfad zum Ziel kopiert wird).quelle
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
ist nur eine weitere Option.Verwenden Sie keine Variationen
--include
oder--filter
Variationen, da dies die Dinge nur verwirrt. Verwenden Sie stattdessen--files-from=_filename_
. (Wenn Sie dies tun, stellen Sie sicher, dass Sie viele Tests durchführen.)Erstellen Sie die Verzeichnisliste in einer Datei, einem Verzeichnis / einer Datei pro Zeile.
Verwenden Sie rsync's
--files-from=
mit der obigen Datei.Verwenden Sie die Option
--relative
/-R
, um sicherzustellen, dass die Quellpfadnamen am Ende des Ziels kopiert werden.Auch wenn Sie die
-a
Option haben, schließen Sie auch ein-r
. Von der Manpage:Vollständiger Befehl:
(Die Dateien in list_of_files.txt müssen relativ sein oder sich im Verzeichnis der obersten Ebene befinden. )
(Wenn DEBUG gesetzt ist, druckt rsync lediglich aus, was möglicherweise kopiert wurde.)
quelle
--include-from
wird auch funktionieren, aber was ich dann gesagt habe,-r
ist weitgehend irrelevant.Das rsync-Handbuch warnt vor diesem Szenario (Abschnitt „Musterregeln ein- / ausschließen“):
In Ihrem Fall, ich denke , die einfachste Ansatz , um die Liste der Verzeichnisse zu vorverarbeiten wäre so zu schließen , dass , wann immer Sie sind
/path/to/foo
, Sie sind auch alle übergeordneten Verzeichnisse (/path/to
,/path
,/
) und auch Verzeichnisse der ursprünglichen Verzeichnisse enthalten (/path/to/foo/***
) und nach All dies hat eine Regel, die alles ausschließt, was zuvor nicht aufgeführt war (*
).quelle