
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/
ファイルのみをコピーするように指示する必要があります。.pdf
Rsyncのフィルタリングルールはマニュアルを読むのが難しいかもしれませんが、いくつかの簡単なルールで多くの例を構築できます。
包含と除外:
- 名前または場所別にファイルを除外するのは簡単です
--exclude=*~
(--exclude=/some/relative/location
ソースパラメータベース、例:除く~/LaTeX/some/relative/location
)。 - いくつかのファイルまたは場所のみを一致させるには、その項目を含めてください。これを指すすべてのディレクトリを含めます。(例:使用
--include=*/
)を使用してから、を使用して残りを除外します--exclude='*'
。これが原因です: - ディレクトリを除外すると、そのディレクトリの下のすべてのエントリが除外されます。除外されたファイルはまったく考慮されません。
- ディレクトリが含まれていても、そのコンテンツは自動的には含まれません。最新バージョンでは
--include='directory/***'
これが行われます。 - 各ファイルに最初の一致ルールが適用されます(一致しないルールも含まれます)。
- 名前または場所別にファイルを除外するのは簡単です
パターン:
- パターンが含まれていない場合は、
/
ディレクトリのないファイル名に適用されます。 - パターンがで終わる場合は、
/
ディレクトリにのみ適用されます。 - パターンがで始まる場合、引数として
/
渡されたディレクトリのフルパスに適用されます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/
答え2
rsync -av --include="*/" --include="*.pdf" --exclude="*" ~/Latex/ ~/Output/ --dry-run
デフォルトではすべての項目が含まれているため、すべての項目を明示的に除外する必要があります。後ろに転送したいファイルが含まれています。実際にファイルを転送するには、--dry-runを削除してください。
次から始める場合:
--exclude '*' --include '*.pdf'
グリディマッチングはすべてを一度に除外します。
しようとした場合:
--include '*.pdf' --exclude '*'
これにより、最上位フォルダにあるPDFファイルのみが転送されます。 「*」で除外されたディレクトリは従いません。
答え3
このようなパターンを使用すると、*.pdf
シェルはパターンを「拡張」して、現在のディレクトリにあるすべての項目に置き換えます。実行中のコマンド(この場合はrsync)はパターンを使用しようとしていることを認識しません。
使用するとき扱いにくいしかし、簡単な解決策があります。**
パターンを使用してフォルダを再帰的に一致させることができます。この試み:
rsync -avn ~/LaTeX/**/*.pdf ~/Output/
答え4
「パターンルールの埋め込み/除外」セクションでマンページ、これを行う方法は次のとおりです。
rsync -avn --include="*/" --include="*.pdf" ~/Latex/ ~/Output/
これとkbrdの答えの主な違いは、名前が何で--include="*/"
あれ、見つかったディレクトリをコピーし続けるようにrsyncに指示するフラグです。これは、サブディレクトリをコピーする指示がない限り、rsyncがサブディレクトリに繰り返されないために必要です。
また、引用符を使用すると、シェルが現在のディレクトリに基づいてファイル名にパターンを拡張し、次のいずれかを実行するのを防ぐことができます。
--include=foo.pdf
成功し、フィルタを混乱させます。 (誰かがいつ...というファイルを生成するのか実際にはわかりませんが、これらのフラグの途中にある可能性はありません。)失敗してコマンドを実行するのではなく、エラーが発生する可能性があります(zshがデフォルトで実行するように)。