rsync --include が 0 個または 1 個の文字と一致できますか?

rsync --include が 0 個または 1 個の文字と一致できますか?

できる

rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/

次のように単純化されました。

rsync -a --include="*.[Jj][PpFf][EIi]?[GgFf]" --exclude="*" tmp/a/* tmp/b/

.jpg .JFIF .jpegを次のように一致させます。

ls tmp/a/*.{J,j}{P,p,F,f}{I,i,E,e,}{G,g,F,f} 2>/dev/null


動作するサンプルテストを作成しましたが、foo.jp.pngと一致するリスクなしに埋め込み画像を--includeにマージしたい --include="*.[Jj][Pp]*[Gg]"(複製したくありません)

mkdir -p tmp/a; touch tmp/a/foo.jpeg; touch tmp/a/bar.jpg; rm tmp/b/*; rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/ ; ls -la tmp/b

答え1

他のツールを使用してファイルのリストを見つけて、rsyncにパイプする方が良いでしょう。たとえば、

find /tmp/a -iregex '.*\(jpe?g\|jfif\)' | 
rsync -nav --files-from=- / /tmp/b

大文字と小文字を無視することを意味します-iregex。正規表現パターンは^始まりと終わりに$暗黙の意味を持ちます。デフォルトの正規表現タイプは次のとおりです。Emacsだからバックスラッシュが必要です。

-n(何もコピーしないためにrsyncに残しました)。--files-from暗黙的に、-Rこれはフルパス(たとえば)をtmp/a/t.jpgターゲットにコピーすることを意味するため、クエリでは絶対パスを使用し、rsyncとして使用します。~から目次( /)。これは、ルックアップとrsyncに提供する必要がある起動ディレクトリを理解するまでテストを簡素化するためです。

たとえば、tmp/aプレフィックスを削除するには、次のようにします(cd /tmp/a; find . ... ) | rsync ... /tmp/a /tmp/b。 find が出力されt.jpg、 rsync が でファイルを見つけて/tmp/aからファイルを生成します。t.jpg/tmp/b

答え2

@meuhの答えが好きです。この答えは理由を説明しますヤヨンの答え実行方法は次のとおりです。0または1マッチrsync

rsyncマニュアルページの指示に従って、コマンドラインINCLUDE/EXCLUDE PATTERN RULESrsync0または1の機能を使用できないと考えられています。

rsyncシェルのコマンドラインの拡張バージョンを使用しているようです。パターンマッチング(「ワイルドカード」)は次のように異なります。正規表現マッチ。

0個または1個の機能を使用できます。拡張パターンマッチングいくつかのシェル(extglobのオプションbash)がありますが、これについての議論や同様のことはありません。拡張パターンマッチングマンページの機能rsync

関連情報