本地 rsync 命令捕获 / 的子子目录

本地 rsync 命令捕获 / 的子子目录

任务很简单:创建/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-print0rsync'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"

相关内容