linux - 如何格式化rsync -exclude-from文件,使其排除文件/目录,但在同一路径中包含其他文件/目录

原文 标签 linux bash rsync

rsync有很多在线的howto,但是经过几天的努力,反复阅读手册,并从文件中删除,我需要帮助。
我创建了一个自定义的本地init脚本,将根文件系统加载到ram中,为了支持这个环境,我构建了一个名为ramsync的实用程序,它在/(in ram)和/在“备份”磁盘上执行rsync。当我只想排除许多路径及其内容时,这一切进展顺利。我使用这个系统已经有一段时间了,但是在阅读了关于rsync的更多信息之后,我想扩展这个实用程序,让它有一个易于调整的模式配置文件,包括一些文件。这是我遇到麻烦的例子。
在ram上运行时安装软件,和正常安装一样简单,然后调用ramsync来复制磁盘上的更改。这比直接在磁盘上执行安装的所有解包/旋转要快一点,因为您只需在所有文件IO完成后将最终状态写下来。(进行openstack计算节点构建的时间差超过一小时)
我的ramsync默认排除项如下:

cat > /tmp/excludes << EOF
/boot/
/boot/*
/dev/*
/dev/pts
/dev/
/media/*
/mnt/
/mnt/*
/proc/*
/proc/
/sys/*
/sys/
/tmp/*
/tmp/
/run/*
/run/
/var/cache/
/var/cache/*
/var/log/
/var/log/*
/var/run/
/var/run/*
/var/lock/
/var/lock/*
/var/tmp/*
/lib/modules/*/volatile/.mounted
/etc/apparmor.d/cache/*
/ramsync/*
/etc/mtab
EOF

(/ramsync是RAM中磁盘的装入点)
我通过rsync的“--exclude from'/tmp/excludes”使用了这个列表。进一步阅读rsync的手册页,我认为exclude/include的概念有点误导,因为--exclude from和--include from both可以使用-and+运算符同时包含include和exclude,如果不包含运算符,include/exclude只是暗示默认值。我的阅读和我认为在理解rsync过滤模式和解析方面的进展使我将这个模式文件重新制作为:
cat > /tmp/excludes << EOF
- /lib/modules/*/volatile/.mounted
- /etc/apparmor.d/cache/***
- /etc/mtab
- /var/cache/***
- /var/lock/***
- /var/log/***
- /var/run/***
- /var/tmp/***
- /boot/***
- /dev/***
- /media/***
- /mnt/***
- /proc/***
- /sys/***
- /tmp/***
- /ramsync/***
- /run/***
EOF

然后,我尝试将一些include应用于此,以获取/var/log/中的一些文件和目录,但只获取我指定的那些文件和目录。
所有的序言都在问我的问题:
除了
/var/log/nova/(目录)
/var/log/vcos_install.log(文件)
我需要保存这个文件和目录。我清楚地知道我想复制哪些目录和文件,以及我想排除哪些目录和文件,但是我不知道什么语法是有意义的。我尝试过各种包含/排除模式的组合,但似乎无法确定rsync调用要表示我所需的行为。
我试图在/tmp/excludes的顶部添加以下内容,但是没有骰子。
+ /var/log/vcos_install.log
+ /var/log/nova/***

我正在阅读试图正确形成这个问题的手册页,并进行了更多的实验,似乎应该这样做,但它没有。我感到困惑(rsync)
+ /var
+ /var/log
+ /var/log/vcos_install.log
+ /var/log/nova/

最佳答案

好吧,昨晚我写了这篇文章,做了更多的实验,我发现我离得很近,很近,而且很可能已经破解它太久了。最后的答案是后面的斜杠,知道递归路径遍历包括dir,然后在包含所需的子目录和文件之后排除内容。所以我的建议几乎是对的。

+ /var/
+ /var/log/
+ /var/log/vcos_install.log
+ /var/log/nova/
- /var/log/***

运行命令时的结果:
rsync-ahhsx--progress--delete--exclude from'/tmp/filters'//ramsync
sending incremental file list
./
root/.bash_history
          1.77K 100%    0.00kB/s    0:00:00 (xfr#1, ir-chk=1456/8825)
var/log/
var/log/vcos_install.log
             82 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=7/68722)
var/log/nova/

在源代码中还有许多与目标不同的其他文件,但只有显式包含的目录(/var/log/nova)和我的安装程序日志被复制下来。这是我正在寻找的混合排除/包含结果。有时把问题以连贯的格式放在一起有助于解决问题。

相关文章:

linux - 如何更改rvm安装位置?

java - OS X上的JVM总是以状态0退出(如Bash脚本中所捕获)?

linux - 无法使cronjob获得服务状态

python - Python Subprocess.Popen来自一个线程

macos - 使用Homebrew在OS X上升级rsync

rsync - rsync错误:无法在“ / foo / bar”上设置时间:不允许操作

linux - 循环直到连接到SSH

linux - 没有客户的隧道

c++ - 如何制作不依赖于.so文件的可执行二进制文件

linux - 在换行中显示csv文件的列标题[关闭]