rsync mit 'files from' in Platzhaltern

9

[Ich musste das Beispiel ändern, um zu verdeutlichen, dass es Unterverzeichnisse gibt.]

Angenommen, ich möchte eine Teilmenge meiner Hierarchie neu erstellen. Nehmen wir aus Gründen der Argumentation an, ich möchte Dateien in der Datei filelist.conf sichern

# cat rsync-list
ab*
bb*

und

# find .
.
./abc
./abc/file-in-abc
./abd
./abd/file-in-abd
./aca
./bba
./bbc
./bca
./rsync-list

Das hätte ich gehofft

rsync -arv --include-from=rsync-list --exclude='*' . /somewhere-else

würde abc, abd, bba und bbc neu erstellen. Das Problem ist, dass es nicht in die ab * -Verzeichnisse absteigt, also nicht abc / file-in-abc und abd / file-in-abd. In diesem Sinne ist das ab * also kein Platzhalter, der in abc und abd erweitert und dann synchronisiert wird.

ivo Welch
quelle
*stimmt auch nicht mit der /Shell-Platzhaltererweiterung überein . Verwenden Sie **stattdessen.
Muru
1
zwei weitere Hinweise: [1] -vv erklärt, warum Muster es schaffen oder nicht. [2] Um ein Unterverzeichnis einzuschließen, müssen seine Pfade eingeschlossen werden. Wenn sich beispielsweise /etc/logrotate.d/ in der Liste befindet, wird dies ignoriert, es sei denn, / etc befindet sich ebenfalls in der Liste.
ivo Welch

Antworten:

26

Die Manpage listet diese fünf Optionen auf:

--exclude=PATTERN       exclude files matching PATTERN
--exclude-from=FILE     read exclude patterns from FILE
--include=PATTERN       don't exclude files matching PATTERN
--include-from=FILE     read include patterns from FILE
--files-from=FILE       read list of source-file names from FILE

--files-fromsteht für genaue Dateinamen und --include-fromfür Muster, daher sollten Sie dies stattdessen versuchen.

Mit include-from, nicht wahr müssen angeben +, aber Sie müssen alles andere auszuschließen. Zum Beispiel gegeben:

$ ls -v1 source
image1.tiff
...
image700.tiff
$ cat includes
image7*.tiff

Dann kann ich nur synchronisieren image7*.tiffmit:

rsync -aP --include-from=includes --exclude='*' source/ target

Die Manpage sagt auch im INCLUDE/EXCLUDE PATTERN RULESAbschnitt:

  • Ein '*' entspricht einer beliebigen Pfadkomponente, stoppt jedoch bei Schrägstrichen.
  • Verwenden Sie '**', um alles abzugleichen, einschließlich Schrägstriche.
muru
quelle
7

Sie können --include-fromanstelle von verwenden, --files-fromwenn Sie Platzhalter verwenden möchten. filelist.confsollte so aussehen:

+ /usr/lib/ld-* 
+ /usr/bin/gcc*
+ /etc/passwd
+ /etc/nonexisting
- *

Sie müssen angeben +oder -in die Datei einschließen oder ausschließen. Die - *Regel am Ende ist erforderlich, damit Include-Regeln funktionieren, da standardmäßig alles enthalten ist. Stellen Sie dies nicht an die erste Stelle, da es sonst die Include-Regeln überschreibt.

Graeme
quelle