因此,我目前正在编写自己的简单备份客户端(显然基于rsync),经过大量的试验和错误,我(希望)只剩下一个问题。
源文件夹结构
.
├── .hidden_file.txt
├── .hidden_folder
│ └── .keep
├── regular_file.txt
└── regular_folder
└── .keep
备份命令
如您所见,我试图“简单地”排除与
regular*
相匹配的传送,但明确在.keep
文件夹中包括了regular_folder
文件。至少是这个主意。
rsync --archive --relative --prune-empty-dirs <many other options> \
--include='/data/source/regular_folder/.keep' \
--exclude='regular*' \
/data/source /data/target/<timestamp>
我想要的是
.
├── .hidden_file.txt
└── .hidden_folder
└── .keep
└── regular_folder
└── .keep
我实际上得到了什么
.
├── .hidden_file.txt
└── .hidden_folder
└── .keep
很明显,我做了很多类似的工作,例如阅读手册,但要么明显的事情一定使我溜走了,要么...我不知道。
我了解在我的情况下,我必须另外添加
--include='/data/source/regular_folder/
(我想要的文件的父目录),但是如果.keep
旁边还有其他文件,则,这些文件也会自动包括在内,而我不需要 。感谢您的帮助,我真的很感激:)
更新资料
编辑
忽略所有。对于我的新测试用例,它不再起作用了(这很有意义,因为排除项应始终在源代码之前。不知道为什么它适用于我的初始测试)。回到绘图板 :/
原始
在按照建议进行了单元测试之后(可悲的是,它并没有达到我想要的方式),我想到了其他东西。
无需通过
--include
添加我明确想要的文件/文件夹,我可以将它们作为rsync的其他源添加。新命令如下所示:
rsync --archive --relative --prune-empty-dirs <many other options> \
--exclude='regular*' \
/data/source /data/source/regular_folder/.keep' \
/data/target/<timestamp>
这很好用,但是...
...你猜对了,还有另一个问题。当通配符必须下降到目录中时,Source并不能真正使用它们。
假设我要保留所有
.keep
文件,我想:rsync --archive --relative --prune-empty-dirs <many other options> \
--exclude='regular*' \
/data/source /data/source/*/.keep' \
/data/target/<timestamp>
多个
*
也不起作用。现在的问题。我只是愚蠢地想让它正常工作还是那不可能?
我知道源代码在平面层次结构中使用通配符。
例如,以下将作为源:
/some/path/*.txt
最佳答案
尝试这个:
--include='/data/source/regular_folder/.keep'
--exclude='regular*/**'
基本上,这排除了
regular_folder
内部的所有文件,但不包括文件夹本身。但是,它确实排除了子目录,因此更深层次的
.keep
文件将无法工作。如果您有这样的话,那么这样的事情应该起作用:--include='/data/source/regular_folder/.keep'
--include='/data/source/regular_folder/deeper/deeper/.keep'
--include='*/'
--exclude='regular*/**'
或者,仅包含所有
.keep
文件:--include='.keep'
--include='*/'
--exclude='regular*/**'
'*/'
的意思是“包括所有目录”,但是没有说明文件。关于linux - rsync : include file from excluded directory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38977031/