GNU/Linux >> Linux の 問題 >  >> Linux

Rsyncフィルター:1つのパターンのみをコピーしますか?

LaTeXからコンパイルされたPDFのみを格納するディレクトリを作成しようとしています。各プロジェクトを別々のフォルダーに保存し、すべてを LaTeXという大きなフォルダーに格納するのが好きです。 。だから私は走ってみました:

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

〜/ LaTeX /にあるすべてのPDFが見つかります それらを出力フォルダに転送します。これは機能しません。 「*。pdf」に一致するものが見つからなかったことがわかります 「。このフィルターを省略した場合、コマンドはLaTeXの下のすべてのプロジェクトフォルダー内のすべてのファイルを一覧表示します。したがって、*。pdfフィルターに問題があります。 〜/を置き換えてみました ホームディレクトリへのフルパスがありますが、効果はありませんでした。

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

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

わかった。だから更新:いいえ、私は試していません

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

そして、これは私にファイルリスト全体を与えます。すべてが最初のパターンに一致するためだと思います…

承認された回答:

TL、DR:

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

Rsyncはソースを宛先にコピーします。 *。pdfを渡した場合 ソースとして、シェルはこれを .pdfを持つファイルのリストに展開します 現在のディレクトリの拡張子。ソースとしてディレクトリを渡さなかったため、再帰的なトラバーサルは発生しません。

したがって、 rsync -a〜/ LaTeX /〜/ Output /を実行する必要があります 、ただし、rsyncに .pdfをコピーするように指示するフィルターがあります ファイルのみ。マニュアルを読むと、Rsyncのフィルタールールは気が遠くなるように思えるかもしれませんが、いくつかの簡単なルールで多くの例を作成できます。

  • 包含と除外:

    • 名前または場所でファイルを除外するのは簡単です:-exclude =*〜-exclude =/ some / relative / location (ソース引数に対して、たとえば、これは〜/ LaTeX / some / relative / locationを除外します 。
    • 少数のファイルまたは場所のみを照合する場合は、それらを含め、それらにつながるすべてのディレクトリを含めます (たとえば、-include =* /を使用します )、-exclude ='*'で残りを除外します 。これは次の理由によるものです:
    • ディレクトリを除外すると、その下のすべてが除外されます。除外されたファイルはまったく考慮されません。
    • ディレクトリを含める場合、その内容は自動的に含まれません。最近のバージョンでは、-include ='directory / ***'
    • ファイルごとに、最初の一致ルールが適用されます(一致しなかったものはすべて含まれます)。
  • パターン:

    • パターンに/が含まれていない場合 、ファイル名sansディレクトリに適用されます。
    • パターンが/で終わる場合 、ディレクトリにのみ適用されます。
    • パターンが/で始まる場合 、引数として渡されたディレクトリから rsyncへのパス全体に適用されます 。
    • * 単一のディレクトリコンポーネントの任意のサブストリング(つまり、 /と一致することはありません ); ** 任意のパスサブストリングに一致します。
  • ソース引数が/で終わる場合 、その内容がコピーされます( rsync -r a / b b / fooを作成します すべてのa/ foo )。それ以外の場合は、ディレクトリ自体がコピーされます( rsync -r a b b / aを作成します 。

関連:いつ追加のファイル記述子を使用しますか?

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

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

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

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

Linux
  1. 名前がマイナスにすぎないディレクトリを入力する方法は?

  2. 1つのパーティションのみを同期する方法は?

  3. Bashスクリプトのインスタンスを1つだけ実行するようにするにはどうすればよいですか?

  1. Sed:パターンマッチの最初の出現のみを印刷しますか?

  2. Rsyncで転送されたファイルのみをログに記録しますか?

  3. Rsyncはディレクトリのアクセス許可を変更していますか?

  1. 1つのコマンドで2つのファイルタイプをRsyncしますか?

  2. cp:ディレクトリの省略 – Linux でディレクトリをコピー中にエラーが発生しました

  3. rsync ディレクトリ内の N 個の最新ファイル