任务很简单:创建/usr/local/bin
及其中的文件的备份,并保留路径信息。
以下方法有效,但我不太明白我做了什么。我注意到包含和排除的顺序可能很重要。此外,“/usr/*”不能替换为“*”。
# --dry-run is for convenience.
rsync --dry-run -aczvAXHS --progress \
--include="/usr/local" \
--exclude="/usr/*" \
--include="/usr/local/bin" \
--exclude="/usr/local/*" \
/usr \
backup/folder
有人能解释一下完成这项任务的更好的方法吗?
--- 编辑以添加 ---
正如评论中指出的那样,问题本来可以更精确。此处提供的答案有望在“存档几个选定的 [子子子] 文件夹”的上下文中起作用/
。
答案1
您可以使用该-R
选项。来自man rsync
:
-R,--相对
使用相对路径。这意味着命令行上指定的完整路径名将被发送到服务器,而不仅仅是文件名的最后部分。
例子:
% rsync -acvzRAHSX /usr/local/bin/ out_dir/
sending incremental file list
/usr/
/usr/local/
/usr/local/bin/
/usr/local/bin/foobar
/usr/local/bin/spamegg
% tree
.
└── out_dir
└── usr
└── local
└── bin
├── foobar
└── spamegg
% tree /usr/local/bin
/usr/local/bin
├── foobar
└── spamegg
答案2
另一种方法是读取rsync
文件列表,然后从中同步/
:
find /usr/local/bin -print0 | rsync --dry-run -0acvzRAHSX --files-from=- / backup/folder
find
's-print0
和rsync
's-0
使用由空字符分隔的文件名 - 这是处理输入文件名的最安全的方法。
答案3
下面似乎可以很好地列出需要存档的文件和文件夹,但可能存在例外:
find \
"/usr/local/bin" \
"/var/www/owncloud/themes/mytheme" \
"/usr/share/cowsay/cows" \
! -path "/var/www/owncloud/themes/mytheme/core/css*"
然后可以按以下方式运行该命令并通过管道传输到rsync
:
find \
"/usr/local/bin" \
"/var/www/owncloud/themes/mytheme" \
"/usr/share/cowsay/cows" \
! -path "/var/www/owncloud/themes/mytheme/core/css*" \
-print0 | \
sudo rsync -0aczvAXHS --progress --files-from=- / "Backups/folder"