これが私の「人に釣りを教える」答えです:
Rsync の構文は明らかに直感的ではありませんが、理解する価値はあります。
<オール>-vvv
を使用します rsync のデバッグ情報を表示します。$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *
ここでの重要な概念は、rsync が各ディレクトリの包含/除外パターンを再帰的に適用することです。最初の包含/除外が一致するとすぐに、処理は停止します。
評価する最初のディレクトリは /Storage/uploads
です . Storage/uploads
1280000000/, 1260000000/, 1270000000/
あります ディレクトリ/ファイル。 file_11*.jpg
に一致するものはありません 含める。それらはすべて *
に一致します 除外する。したがって、それらは除外され、rsync は終了します。
- 解決策は、すべてのディレクトリを含めることです (
*/
) 最初。次に、最初の dir コンポーネントは1260000000/, 1270000000/, 1280000000/
になります*/
に一致するため .次の dir コンポーネントは1260000000/
になります .1260000000/
で 、file_11_00.jpg
--include="file_11*.jpg"
に一致 ですので、含まれています。など
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg
https://download.samba.org/pub/rsync/rsync.1
問題は --exclude="*"
(たとえば) 1260000000/
を除外するように指示します ディレクトリなので、rsync
そのディレクトリの内容を調べないため、ディレクトリに --include
と一致するファイルが含まれていることに気付くことはありません .
あなたが望むものに最も近いものはこれだと思います:
rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(これには、すべてのディレクトリと、file_11*.jpg
に一致するすべてのファイルが含まれます 、他のファイルはなし)、または おそらく これ:
rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(同じ概念ですが、含まれるディレクトリについてはより明確です)。
rsync
除外パターンの例を含める:
"*" means everything
"dir1" transfers empty directory [dir1]
"dir*" transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*" transfers files whose names start with [file]
"dir**" transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***" same as above
"dir1/*" does nothing
"dir1/**" does nothing
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...
最後に、パスを評価するために最初に使用されるアスタリスクに頼らないでください。 "**dir"
のように (パスではなく、単一のフォルダーまたはファイルに使用しても問題ありません)。また、3 つ以上のアスタリスクはファイル名には機能しないことに注意してください。