GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rsync-Filter:Nur ein Muster kopieren?

Ich versuche, ein Verzeichnis zu erstellen, das alle und nur meine aus LaTeX kompilierten PDFs enthält. Ich mag es, jedes Projekt in einem separaten Ordner aufzubewahren, alles in einem großen Ordner namens LaTeX . Also habe ich versucht, Folgendes auszuführen:

rsync -avn *.pdf ~/LaTeX/ ~/Output/

die alle PDFs in ~/LaTeX/ finden sollte und in den Ausgabeordner übertragen. Das funktioniert nicht. Es sagt mir, dass es keine Übereinstimmungen für "*.pdf" gefunden hat “. Wenn ich diesen Filter weglasse, listet der Befehl alle Dateien in allen Projektordnern unter LaTeX auf. Es ist also ein Problem mit dem *.pdf-Filter. Ich habe versucht, ~/ zu ersetzen mit dem vollständigen Pfad zu meinem Home-Verzeichnis, aber das hatte keine Auswirkung.

Ich benutze zsh. Ich habe versucht, dasselbe in bash und sogar with zu tun der Filter, der jede einzelne Datei in jedem Unterverzeichnis auflistete … Was ist hier los?

Warum versteht rsync meinen Nur-PDF-Filter nicht?

OK. Also Update:Nein, ich versuche es

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

Und das gibt mir die ganze Dateiliste. Ich schätze, weil alles dem ersten Muster entspricht…

Akzeptierte Antwort:

TL,DR:

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync kopiert die Quelle(n) zum Ziel. Wenn Sie *.pdf übergeben als Quellen erweitert die Shell dies um die Liste der Dateien mit dem .pdf Erweiterung im aktuellen Verzeichnis. Es findet keine rekursive Traversierung statt, da Sie kein Verzeichnis als Quelle übergeben haben.

Sie müssen also rsync -a ~/LaTeX/ ~/Output/ ausführen , aber mit einem Filter, der rsync anweist, .pdf zu kopieren nur Dateien. Die Filterregeln von Rsync können entmutigend wirken, wenn Sie das Handbuch lesen, aber Sie können viele Beispiele mit nur wenigen einfachen Regeln konstruieren.

  • Einschlüsse und Ausschlüsse:

    • Das Ausschließen von Dateien nach Name oder Ort ist einfach:--exclude=*~ , --exclude=/some/relative/location (relativ zum Quellargument, z. B. schließt dies ~/LaTeX/some/relative/location aus ).
    • Wenn Sie nur ein paar Dateien oder Speicherorte abgleichen möchten, schließen Sie sie ein, schließen Sie alle Verzeichnisse ein, die zu ihnen führen (zum Beispiel mit --include=*/ ), schließen Sie dann den Rest mit --exclude='*' aus . Das liegt daran:
    • Wenn Sie ein Verzeichnis ausschließen, schließt dies alles darunter aus. Die ausgeschlossenen Dateien werden überhaupt nicht berücksichtigt.
    • Wenn Sie ein Verzeichnis einschließen, schließt dies nicht automatisch seinen Inhalt ein. In neueren Versionen --include='directory/***' werde das tun.
    • Für jede Datei gilt die erste Übereinstimmungsregel (und alles, was nie übereinstimmt, wird eingeschlossen).
  • Muster:

    • Wenn ein Muster keinen / enthält , es gilt für den Dateinamen ohne Verzeichnis.
    • Wenn ein Muster mit / endet , es gilt nur für Verzeichnisse.
    • Wenn ein Muster mit / beginnt , gilt es für den gesamten Pfad aus dem Verzeichnis, das als Argument an rsync übergeben wurde .
    • * jede Teilzeichenfolge einer einzelnen Verzeichniskomponente (d. h. stimmt niemals mit / überein ); ** stimmt mit jedem Pfad-Teilstring überein.
  • Wenn ein Quellargument mit einem / endet , sein Inhalt wird kopiert (rsync -r a/ b erstellt b/foo für jeden a/foo ). Andernfalls wird das Verzeichnis selbst kopiert (rsync -r a b erstellt b/a ).

Verwandte:Wann würden Sie einen zusätzlichen Dateideskriptor verwenden?

Daher müssen wir hier *.pdf einfügen , schließen Sie Verzeichnisse ein, die sie enthalten, und schließen Sie alles andere aus.

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Beachten Sie, dass dadurch alle Verzeichnisse kopiert werden, auch diejenigen, die keine passende Datei oder Unterverzeichnisse enthalten, die eine enthalten. Dies kann mit --prune-empty-dirs vermieden werden Option (es ist keine universelle Lösung, da Sie dann ein Verzeichnis nicht kopieren können, selbst wenn Sie es explizit abgleichen, aber das ist eine seltene Anforderung).

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Linux
  1. Wie betrete ich ein Verzeichnis, dessen Name nur ein Minus ist?

  2. Möglichkeit, nur eine Partition zu synchronisieren?

  3. Wie kann man sicherstellen, dass nur eine Instanz eines Bash-Skripts ausgeführt wird?

  4. Sed:Nur das erste Auftreten einer Musterübereinstimmung drucken?

  5. Rsync ändert die Verzeichnisberechtigungen?

So verwenden Sie Rsync

Nur übertragene Dateien mit Rsync protokollieren?

Linux rsync-Befehlsbeispiele

Was passiert, wenn mv unterbrochen wird?

Rsync kopiert aktuelles Verzeichnis mit Namen

Einrichten von DRBD mit nur einem Knoten