我正在尝试找到备份点文件的最佳方法,并且我已经设计了一种方法来做到这一点。我使用 git 和 rsync 来备份所有点文件。 rsync 脚本现在看起来像这样:
rsync -avhP $HOME/.??* --exclude-from=$HOME/.dotBackup/exclusions.list $HOME/.dotBackup
但是,我认为这不是最佳方法,exclude-from
我不想使用 arg 排除文件,而是想反过来做,并有一个我想要备份的特定目录和文件的列表。这就是事情变得有点模糊的地方。例如,我可能想备份一些文件~
,其目录~
如下所示:
~
|- Downloads (do not back up)
|- .bashrc (back up)
|- .config
|- nvim (back up including subdirectories)
|- code
|- extensions (do not back up)
|- preferences.json (back up)
我怎样才能使用 rsync 来做这样的事情?
答案1
这是使用 rsync 过滤器文件的示例,将其与选项--filter='dir-merge /.rsync-filter'
或简单地一起使用-F
。
将文件.rsync-filter
放入您的 rsync 源目录(您的$HOME
)中,内容如下:
# include .bashrc
+ /.bashrc
# include .config dir (parent of nvim and code)
+ /.config/
# exclude (overrides nvim include below)
- /.config/nvim/but_not_this_dir/
# include nvim dir and everything in this directory
+ /.config/nvim/***
# include code dir and preferences.json
+ /.config/code/
+ /.config/code/preferences.json
# exclude everything in the source dir
- *
由于我们使用 排除了源目录中的所有内容- *
,因此您需要手动添加要包含的所有目录,包括其父目录到源目录。要包含foo/bar/
但不包含foo/abc/
,您需要添加+ /foo/
到 override- *
和+ /foo/bar/
。需要在这些包含之前添加对这些包含的覆盖。
使用 dry-run 选项测试您的命令-n
以查看输出,添加-vv
以查看过滤器显示/隐藏哪些文件/目录。
您修改后的命令将是:
rsync -avFhp ~/ ~/.dotBackup
如果您需要大量覆盖(同步这个和那个目录,但排除这个/foo和那个/bar/baz),那么使用这样的过滤器是有意义的。使用--files-from
中的选项罗艾玛的回答对于更简单的用例。
答案2
我可能想备份文件,
~/.config/ABC/
除了~/.config/ABC/ex
如何使用rsync
?
- 包含您想要的文件和目录
- 排除您不需要的文件和目录
因此,假设命令是从 运行的$HOME
,我们有这样的:
rsync --dry-run -avP --exclude '/ex' .config/ABC/ ABCBackup
或者,如果您正在讨论修改现有命令来复制下面的所有点文件和目录$HOME
:
rsync --dry-run -avP --exclude '.config/ABC/ex/' --exclude '.dotbackup/' .??* .dotBackup
从声明来看,“我想要 [...] 有一个我想要备份的特定目录和文件的列表“,这要容易得多。
将文件列表放入一个文件中,例如$HOME/.to_backup
.如果您有完整的目录要包含在内,也请添加这些目录 - 末尾带有斜杠。所有路径都可以相对于$HOME
.使用您的示例树,该文件将包含以下条目:
.bashrc
.config/nvim/
.config/code/preferences.json
然后使用此命令(--dry-run
一旦按预期工作就将其删除):
cd # Start from $HOME so relative paths in the source file work correctly
rsync --dry-run --files-from .to_backup -arvP . .dotBackup/