rsync alle Verzeichnisse, die mit einer bestimmten Ziffer beginnen

7

Ich habe ein Verzeichnis mit Tausenden von Unterverzeichnissen geladen:

/home/tmp/
          1
          12
          123
          1234
          2345
          234
          3456
          345
          34

Jedes Unterverzeichnis hat wiederum Hunderte von Unterverzeichnissen, die ich synchronisieren möchte, wenn das Unterverzeichnis der ersten Ebene übereinstimmt ...

Was ich brauche, ist eine Möglichkeit, nur die Verzeichnisse zu kopieren / rsync, die mit einer bestimmten Ziffer beginnen [1-9] ...

Was ich zu wollen glaube, ist im Grunde etwas, das es mir ermöglichen würde, Wildcards zum Matching zu verwenden

rsync -rzvvhP remotehost:/home/tmp/1* /home/tmp/

Ich möchte, dass rsync das synchronisiert

/home/tmp/1/
/home/tmp/12/
/home/tmp/123/
/home/tmp/1234/

Verzeichnisse und untergeordnete Unterverzeichnisse, die sie haben, aber keines der Verzeichnisse der ersten Ebene, die mit einer anderen Ziffer beginnen ...

/home/tmp/234/
/home/tmp/2345/
........./3*/
........./4*/ etc..

Was ich versucht habe:

rsync -rzvvhP --exclude='*' --include-from=1.txt remotehost:/home/tmp/ /home/tmp/

wo 1.txt enthält:

1
12
123
1234

Wenn ich dies mit 2.txt mache, obwohl rsync immer noch alle Verzeichnisse zu durchlaufen scheint, die mit 1 und 3 usw. beginnen ...

Wie kann ich dies tun, damit ich nur die Verzeichnisse mit einem Befehl synchronisieren kann, die mit einer bestimmten Ziffer beginnen?

Kasdega
quelle
1
Ich weiß nicht, ob das Ihr Problem ist, aber Sie möchten das Sternchen möglicherweise vor lokaler Shell-Erweiterung schützen (bevor es überhaupt zu rsync kommt). 'remotehost:/home/tmp/1*'eher als ohne die einfachen Anführungszeichen.
Ein Lebenslauf vom
1
Was ist los mit rsync -rzvvhP remotehost:/home/tmp/1* /home/tmp/?
Gilles 'SO - hör auf böse zu sein'

Antworten:

20

Was Sie vorgeschlagen haben, sollte tatsächlich funktionieren:

rsync -rzvvhP remotehost:/home/tmp/1\* /home/tmp/

( *In den meisten Fällen kann es vorkommen, dass Sie das nicht zitieren , da remotehost:/home/tmp/1\*es unwahrscheinlich ist, dass das Muster mit einer Datei übereinstimmt, sodass es bei den meisten Shell-Setups allein gelassen wird.)

Ihr Versuch mit ist --exclude='*'fehlgeschlagen, da die erste Übereinstimmung gilt und Ihre erste Übereinstimmung für alles ( *) besagt, dass sie ausgeschlossen werden soll.

In diesem Handbuch finden Sie einige allgemeine Prinzipien zu Rsync-Filtern. 1Um hier nur Verzeichnisse einzuschließen, die mit der obersten Ebene beginnen, und alles in eingeschlossene Unterverzeichnisse zu kopieren, schließen Sie ein /1und schließen Sie es aus /*.

rsync -rzvvhP --include='/1' --exclude='/*' remotehost:/home/tmp/ /home/tmp/
Gilles 'SO - hör auf böse zu sein'
quelle
rsync -rzvvhP --size-only --filter="+ /4*/" --exclude='/*'... ist das, was ich letztendlich verwendet habe ... das Problem, von dem ich glaube, dass das Problem darin bestand, dass der Ausschluss zuerst kam ... dies von einem Include zu einem Filter zu ändern.
Kasdega