备份脚本以排除某些父目录并包含某些子目录

备份脚本以排除某些父目录并包含某些子目录

我想做什么备份?

  1. 用户主目录,其中包括Desktop,,,我需要备份每个用户DocumentsPicturesthunderbird
  2. 所有用户都位于/home具有各自用户名的分区中
  3. 有某些用户和文件/home需要排除

到目前为止我已经尝试过什么?

$ tar cvf home01 -T include /home  

笔记:T 表示仅采用文件中提到的内容,但不起作用

$ find . \( -name \*Desktop -o -name \*Documents\* -o -name \*Pictures\*  -o -name \.thunderbird\*   \)  |
  xargs  tar zcvf /opt/rnd/home-$(date +%d%m%y).tar.zip 

笔记:它会备份提及目录,但会将每个用户的目录放入一个文件夹中。

例如

$ ls -l /home

/home/user1/{Desktop,Documents,Pictures,.thunderbird}
/home/user2/{Desktop,Documents,Pictures,.thunderbird}
/home/user3/{Desktop,Documents,Pictures,.thunderbird}
/home/user4/{Desktop,Documents,Pictures,.thunderbird}
/home/user5/{Desktop,Documents,Pictures,.thunderbird}

我只需要从中进行user1user2user3目录备份并排除user4user5

答案1

你快到了!这应该做:

tar zcvf /opt/rnd/home-$(date +%d%m%y).tar.zip */{Desktop,Documents,Pictures,.thunderbird} --exclude=user4 --exclude=user5

答案2

这是一种保留命令使用的方法find

$ find . \( -type d -path */Desktop -o -path */.thunderbird -o -path */Pictures \\) \! -path '*user[45]*' -prune | xargs  tar zcvf /opt/rnd/home-$(date +%d%m%y).tar.gz

这是一个更简单的版本:

$ find . \( -type d                                                   \
     -path */Desktop -o -path */.thunderbird -o -path */Pictures \)   \
     \! -path '*user[45]*' -prune                                     \
  | xargs  tar zcvf /opt/rnd/home-$(date +%d%m%y).tar.gz

这将找到名称位于第一个括号块中的所有目录\( ... \)。这些是目录:

  • */Desktop
  • */thunderbird
  • */Pictures

第二部分排除与模式匹配的任何路径*user[45]*。这些已从列表中删除。最后将生成的目录列表传递给 tar。

需要考虑的其他事项

以上是不是防弹。它将排除包含该字符串user4user5其中的路径。此外,还应注意确保您构建为命令的任何内容都可以处理文件名中的空格。

相关内容