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).
- Das Ausschließen von Dateien nach Name oder Ort ist einfach:
-
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 anrsync
übergeben wurde . *
jede Teilzeichenfolge einer einzelnen Verzeichniskomponente (d. h. stimmt niemals mit/
überein );**
stimmt mit jedem Pfad-Teilstring überein.
- Wenn ein Muster keinen
-
Wenn ein Quellargument mit einem
/
endet , sein Inhalt wird kopiert (rsync -r a/ b
erstelltb/foo
für jedena/foo
). Andernfalls wird das Verzeichnis selbst kopiert (rsync -r a b
erstelltb/a
).
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/