一个名为 android 的文件夹,里面有未定义数量的子目录,其中包含多个文件,其中一些是 APK。一个名为 windows 的文件夹,里面有未定义数量的子目录和多个文件,其中一些是 EXE 文件。
我想使用 rsync 复制整个文件夹结构,但只复制 APK 和 EXE 文件,不复制其他任何文件。
我为此使用了--exclude-from
rsync 选项,但 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