Rsyncフィルタ:1つのパターンのみをコピー

Rsyncフィルタ:1つのパターンのみをコピー

LaTeXでコンパイルされたPDFのみをアーカイブするディレクトリを作成しようとしています。私は各プロジェクトを別々のフォルダに保存し、すべてのプロジェクトをLaTeX

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

すべてのPDFファイルを見つけて~/LaTeX/出力フォルダに転送する必要があります。これはうまくいきません。*.pdf" "と一致するものが見つからないと表示されます。このフィルタを省略すると、コマンドはLaTeXの下のすべてのプロジェクトフォルダにあるすべてのファイルを一覧表示します。したがって、これは* .pdfフィルタに問題があることです。~/私のホームディレクトリのフルパスに置き換えようとしましたが、うまくいきませんでした。

zshを使用しています。私はbashで同じことを試してみました。そしてすべてのサブディレクトリ内のすべてのファイルのフィルタを一覧表示します。何が起こっているのでしょうか?

rsyncがPDF専用フィルタを理解していないのはなぜですか?


いいね、したがって更新:いいえ、努力しています。

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

これにより、完全なファイルのリストが提供されます。すべてが最初のパターンに収まると思います...

ベストアンサー1

TL、博士:

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

Rsync はソースをターゲットにコピーします。ソースに渡されると、シェルはそれを*.pdf現在のディレクトリにある拡張子を持つファイルのリストに展開します。.pdfディレクトリをソースに渡さないため、再帰巡回は発生しません。

したがって、実行する必要がありますが、フィルタを使用してrsyncにrsync -a ~/LaTeX/ ~/Output/ファイルのみをコピーするように指示する必要があります。.pdfRsyncのフィルタリングルールはマニュアルを読むのが難しいかもしれませんが、いくつかの簡単なルールで多くの例を構築できます。

  • 包含と除外:

    • 名前または場所別にファイルを除外するのは簡単です--exclude=*~--exclude=/some/relative/locationソースパラメータベース、例:除く~/LaTeX/some/relative/location)。
    • いくつかのファイルまたは場所のみを一致させるには、その項目を含めてください。これを指すすべてのディレクトリを含めます。(例:使用--include=*/)を使用してから、を使用して残りを除外します--exclude='*'。これが原因です:
    • ディレクトリを除外すると、そのディレクトリの下のすべてのエントリが除外されます。除外されたファイルはまったく考慮されません。
    • ディレクトリが含まれていても、そのコンテンツは自動的には含まれません。最新バージョンでは--include='directory/***'これが行われます。
    • 各ファイルに最初の一致ルールが適用されます(一致しないルールも含まれます)。
  • パターン:

    • パターンが含まれていない場合は、/ディレクトリのないファイル名に適用されます。
    • パターンがで終わる場合は、/ディレクトリにのみ適用されます。
    • パターンがで始まる場合、引数として/渡されたディレクトリのフルパスに適用されますrsync
    • *単一のディレクトリコンポーネントのすべての部分文字列(つまり、一致しない/)は、**すべてのパス部分文字列と一致します。
  • ソースパラメータがで終わると、/その内容がコピーされます(rsync -r a/ bすべてのエントリに対して生成されます)。それ以外の場合は、ディレクトリ自体がコピー(作成)されます。b/fooa/foorsync -r a bb/a


したがって、ここにはを含め*.pdf、それを含むディレクトリを含め、他のすべての項目を除外する必要があります。

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

これは、一致するファイルを含まないディレクトリや一致するファイルを含むサブディレクトリを含むすべてのディレクトリをコピーすることに注意してください。このオプションを使用すると、この問題を回避できます--prune-empty-dirs(明示的に一致してもディレクトリをコピーできないため、一般的なソリューションではありませんがまれな要件です)。

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

おすすめ記事