Rsync:仅包含所有子目录中的特定文件

Rsync:仅包含所有子目录中的特定文件

一个名为 android 的文件夹,里面有未定义数量的子目录,其中包含多个文件,其中一些是 APK。一个名为 windows 的文件夹,里面有未定义数量的子目录和多个文件,其中一些是 EXE 文件。

我想使用 rsync 复制整个文件夹结构,但只复制 APK 和 EXE 文件,不复制其他任何文件。

我为此使用了--exclude-fromrsync 选项,但 APK 文件根本没有被复制。我使用了手册页的这一行来实现我想要的效果: The combination of "+ */", "+ *.c", and "- *" would include all directories and C source files but nothing else (see also the --prune-empty-dirs option)

结果生成以下文件:

+ /android/**/*.apk
+ /android/*/
- /android/*

但实际上什么都没有复制。有人能给我指出正确的方向吗?

答案1

您必须匹配要包含或排除的来自根目录的任何文件和目录。然后,排除所有其余文件和目录。对于您的情况,如下所示:

➜  ~ find /tmp/source 
/tmp/source
/tmp/source/no2
/tmp/source/no1
/tmp/source/no3
/tmp/source/android
/tmp/source/android/no5
/tmp/source/android/yes1.apk
/tmp/source/android/no6
/tmp/source/android/no7
/tmp/source/android/dir1
/tmp/source/android/dir1/no9
/tmp/source/android/dir1/yes2.apk
/tmp/source/android/dir1/no8
/tmp/source/android/dir1/dir2
/tmp/source/android/dir1/dir2/yes3.apk
mkdir /tmp/destination

rsync \
    -f "+ /android/" \
    -f "+ /android/*.apk" \
    -f "+ /android/**/" \
    -f "+ /android/**/*.apk" \
    -f "- /**" \
    -av \
/tmp/source/ /tmp/destination/

瞧:

sending incremental file list
./
android/
android/yes1.apk
android/dir1/
android/dir1/yes2.apk
android/dir1/dir2/
android/dir1/dir2/yes3.apk

相关内容