![](/img/trans.png)
[英]rsync using shopt globstar and **/. - how to exclude directories?
[英]How to exclude directories from xargs rsync?
所以我试图设置一个 bash 脚本用于增量备份,使用rsync
和xargs
在 Ubuntu 服务器 20.042 LTS 上使用多个线程。 我想排除一些目录,但我似乎无法弄清楚如何做到这一点。 目前我正在将ls
传送到xargs
,然后使用 8 个进程执行rsync
:
# Create the archive and begin the backup.
cd /
ls --indicator-style none \
--ignore={"bin","boot","cdrom","data","dev","init*","lib","lib64","lost+found"} \
--ignore={"media","mnt","proc","root","run","sbin","snap","srv","swap.img","sys"} \
--ignore={"tmp","vmlinuz*"} | xargs --max-args 1 --max-procs 8 -I % \
rsync --archive --compress --delete --ignore-missing-args --recursive --verbose \
--link-dest "${backup_link}" "%" \
--exclude={"*tmp*","*.cache"} \
"${backup_path}"
出于某种原因,它仍在尝试在我用ls
命令忽略的目录上使用rsync
。 我尝试将rsync
设置为排除目录:
# Create the archive and begin the backup.
cd /
ls --indicator-style none | xargs --max-args 1 --max-procs 8 -I % \
rsync --archive --compress --delete --ignore-missing-args --recursive \
--exclude={"/bin","/boot","/cdrom","/data/mysql","/data/backup","/dev"} \
--exclude={"/initrd.img","/initrd.img.old","/lib","/lib64","/lost+found","/media"} \
--exclude={"/mnt","/proc","/root","/run","/sbin","/snap","/srv","/swap.img","/sys"} \
--exclude={"**/tmp","/vmlinuz*","*.cache"} \
--link-dest "${backup_link}" "%" "${backup_path}"
它仍然尝试备份我要排除的文件。
我尝试运行多个线程的原因是该脚本设置为通过crontab
每 15 分钟执行一次,并且如果没有多个进程,它只需要不到 15 分钟。 稍后在脚本中,它会将该备份(也使用rsync
)复制到 SMB 服务器,这是所有小文件的巨大瓶颈。
有什么我在这里想念的吗? 还是有更好的方法来实现这一点? 这是一个生产服务器,所以我真的很想避免安装第三方实用程序。
先感谢您!
编辑:在我的第一个答案中,我指出您的--ignore
选项语法不适用于 Mint 19(ls GNU 8.28)。 确实如此,所以这部分现在被删除了!
我总是尝试将find
用于此类任务,而不是信任ls
。 你可以使用这个:
find / -maxdepth 1 -type d ! -name "bin" -print
使用! -name "XXX"
- 多次为您的排除! -name "XXX"
部分。
或者我更喜欢的方法,因为我发现它更容易阅读:
find / -maxdepth 1 -type d -print | egrep -Ev "bin|boot"
您可以在egrep
匹配中包含尽可能多的模式,用|
分隔。 . 在这种情况下, |
就像or
。 所以这里说要过滤掉“bin”或“boot”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.