Wie kann ich in rsync alle Verzeichnisse außer bestimmten und einem Dateityp ausschließen?

Wie kann ich in rsync alle Verzeichnisse außer bestimmten und einem Dateityp ausschließen?

Für ein NLP-Projekt benötige ich eine Kopie der Project Gutenberg-Bibliothek. Das Projekt erlaubt zwar den Download der Dateien, insbesondere zu Spiegelungszwecken (ich plane, irgendwann eine einzurichten), aber für meine Arbeit benötige ich nur eine bestimmte Teilmenge der vorhandenen Dateien.

Die Verzeichnisse an der Quelle sind folgendermaßen organisiert:

|
| - 1 - |
|       |- 1
|       |- 2
|       |...
| - 2
| .
| .
| .
| - 9
| - cache
| - retired
| ...

Die einzigen Verzeichnisse, die mich interessieren, sind die nummerierten, und der einzige Dateityp, der mich interessiert, ist . .txtIch möchte auch keine Dateien, die mit -8.txtoder enden -h.txt, bin aber bereit, sie vorerst zu tolerieren.

Bisher habe ich versucht:

  • --include "*/" --include "*.txt" --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*-8.txt" --exclude "*"<- dieser zieht noch den "cache" Ordner mit ein, da dieser auch einige .txtDateien enthält
  • --include "*/" --include "*.txt" -f'- *\-8.txt' -f'- *\-h.txt' -f'- cache/**' --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*"<- mehr oder weniger das Gleiche

Das Problem scheint folgendes zu sein:

  • Ich muss ausschließenalles, da ich nur eine sehr begrenzte Anzahl an Dingen benötige
  • Ich füge die nummerierten Verzeichnisse hinzu, da das alles ist, was ich brauche
  • Durch das Einschließen *.txtwerden die vorherigen Ausschlüsse aufgehoben, da andere Verzeichnisse auch Textdateien enthalten.

Wie würde ich dabei vorgehen?

Antwort1

Aus dem Beitrag rsync - alle Verzeichnisse außer einigen wenigen ausschließen, ich zitiere aus dem Antwort von Darryl E. Clarke:

Ein einfacher Filter sollte genügen. Um die vorherige Antwort mit einem passenden Beispiel zu ergänzen: Schließen Sie explizit die übergeordneten Elemente sowie alle (**) Unterordner und Dateien ein. Schließen Sie dann alles andere aus. Hier ist filter.txt:

+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /** With the command line:

rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/

Hätte zur Folge:

sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/

sent 202 bytes  received 65 bytes  534.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Fügen Sie hierzu Ihren Filter von hinzu *.txt.

Mit anderen Worten: Erst einschließen, dann alles ausschließen.

Antwort2

Sie können die nummerierten Verzeichnisse explizit mit dem Glob abgleichen [0-9]/:

 -f'+ [0-9]/' \
 -f'- *-[8h].txt' \
 -f'+ *.txt' \
 -f'- *' \

Wenn die Zahlen über 9 hinausgehen, würde möglicherweise auch die Hinzufügung von -f'+ [0-9][0-9]/oder -f'+ [0-9]*/ausreichen.

verwandte Informationen