質問: rsyncフィルター:1つのパターンのみをコピーする latexからコンパイルしたすべてのpdfのみを格納するディレクトリを作成しようとしています。各プロジェクトを別々のフォルダーに保存し、すべてをlatexという大きなフォルダーに格納するのが好きです。だから私は走ってみました:rsync -avn *.pdf ~/latex/ ~/output/ これにより、~/latex/内のすべてのpdfが検出され、出力フォルダーに転送されます。これは機能しません。 「*.pdf」に一致するものが見つからないことがわかります。このフィルターを省略した場合、コマンドはlatexの下のすべてのプロジェクトフォルダー内のすべてのファイルを一覧表示します。したがって、*。pdfフィルターの問題です。 ~/をホームディレクトリへの完全なパスに置き換えてみましたが、効果がありませんでした。私は、zshを使用しています。私はbashで同じことを試してみましたwithすべてのサブディレクトリのすべてのファイルをリストするフィルター...ここで何が起こっているのですか?rsyncが私のpdfのみのフィルターを理解しないのはなぜですか?ok。だから更新:いいえ私はやっていますrsync -avn --include="*/" --include="*.pdf" latex/ output/ そして、これは私にファイルリスト全体を与えます。すべてが最初のパターンに一致するので...
回答: tl、dr:rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/latex/ ~/output/ rsyncはソースを宛先にコピーします。ソースとして*.pdfを渡すと、シェルはこれを現在のディレクトリの.pdf拡張子を持つファイルのリストに展開します。ソースとしてディレクトリを渡さなかったため、再帰的なトラバーサルは発生しません。したがって、rsync -a ~/latex/ ~/output/を実行する必要がありますが、.pdfファイルのみをコピーするようにrsyncに指示するフィルターが必要です。マニュアルを読むと、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/