对于 NLP 项目,我需要一份 Project Gutenberg 库的副本。现在,该项目允许下载其文件,特别是如果用于镜像目的(我计划最终设置一个),但对于我的工作,我只需要现有文件的特定子集。
源目录的组织方式如下:
|
| - 1 - |
| |- 1
| |- 2
| |...
| - 2
| .
| .
| .
| - 9
| - cache
| - retired
| ...
我唯一感兴趣的目录是编号的目录,我唯一感兴趣的文件类型是.txt
,我也不想要以-8.txt
或结尾的文件-h.txt
,但我现在愿意容忍它们。
到目前为止我已经尝试过:
--include "*/" --include "*.txt" --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*-8.txt" --exclude "*"
<- 这个仍然会拉取“缓存”文件夹,因为它还包含一些.txt
文件--include "*/" --include "*.txt" -f'- *\-8.txt' -f'- *\-h.txt' -f'- cache/**' --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*"
<- 或多或少是同一件事
问题似乎是这样的:
- 我需要排除一切因为我需要的东西非常有限
- 我包含了编号目录,因为这就是我所需要的
- 包括
*.txt
打破了先前的排除,因为其他目录也包含文本文件。
我该如何处理这个问题?
答案1
来自帖子 rsync-排除除少数目录之外的所有目录,我引用自 Darryl E. Clarke 的回答:
一个简单的过滤器就可以解决问题。以前面的答案为基础,举一个合适的例子——明确包括父级,以及所有(**)子文件夹和文件。然后排除其他所有内容。以下是
filter.txt
:+ /include_this_dir/ + /include_this_dir/** + /include_that_dir/ + /include_that_dir/** - /** With the command line: rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/
会导致:
sending incremental file list created directory dest_dir ./ include_that_dir/ include_that_dir/somefile.txt include_that_dir/subdir/ include_this_dir/ sent 202 bytes received 65 bytes 534.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)
添加您的过滤器*.txt
。
换句话说:首先包括,然后全部排除。
答案2
您可以使用 glob 明确匹配编号目录[0-9]/
:
-f'+ [0-9]/' \
-f'- *-[8h].txt' \
-f'+ *.txt' \
-f'- *' \
如果数字高于 9,那么添加-f'+ [0-9][0-9]/
或-f'+ [0-9]*/
可能就足够了。