我使用 find 命令查找感兴趣的目录名并按此格式格式化它们,创建了一个 rsync --include-from 文件,+ dirname/***
该文件会复制它及其内容。这按预期工作,但为了减少总传输大小,我需要进一步指定一些我想包含的文件类型,并排除所有其他文件类型。
我遇到的问题是找到一条排除所有文件但不排除目录的规则(有些目录.
的名称中带有,这使得它更加困难)。看起来- ! */
这正是我想要的(从rsync 手册页),因为它应该排除任何非目录的内容(意味着所有文件?)但它似乎从未匹配任何东西。
目前我的包含文件的格式如下:
+ 所需文件扩展名
+ *.txt
- 所有其他文件(问题,尝试
- ! */
)+ 所有需要的目录及其内容
+ cooldir/***
- *
任何帮助都将不胜感激
答案1
包含和排除选项从左到右应用:对于任何给定的文件或目录,第一个匹配的选项即被应用。
在您的案例中,您需要在包含之前声明排除项。以下是使用显式--include
和 --exclude options rather than the more generic
--filter` 选项的示例
-avHXP # My standard set of options
--include 'essentials/***' # Include absolutely everything in here
--exclude '*.tmp' # Exclude *.tmp files from everywhere else
--exclude '*.sh' # Exclude *.sh files from everywhere else
--include 'interesting/***' # Include this directory tree (not *.tmp or *.sh)
--include 'exciting/***' # Include this directory tree too (not *.tmp or *.sh)
--prune-empty-dirs # Don't create directories that would end up being empty
排除所有文件但包含目录的一般方法是这样的。一旦你开始包含文件,你几乎肯定会想要这个--prune-empty-dirs
选项
--include '**/'
--exclude '*'