【问题标题】:Bash script to backup server upload folders用于备份服务器上传文件夹的 Bash 脚本
【发布时间】:2014-09-08 22:14:11
【问题描述】:

我有一个运行 WHM/cPanel 站点的 CentOS 服务器,其中很多站点都运行 WordPress。我想做一个自动备份,将包含“上传”文件夹的任何帐户压缩并移动到备份目录中。我知道还有其他解决方案,但最希望你备份整个 WordPress 网站,但我只需要备份上传的内容。

我不太擅长 .sh 脚本,并且已经花了很多时间试图弄清楚这一点,但我似乎找不到任何足以让我成功的例子。我遇到的主要问题是在帐户之后命名 zip。

大多数上传文件夹的位置(user1 是更改的帐户):

/home/user1/public_html/wp-content/uploads /home/user2/public_html/wp-content/uploads /home/user3/public_html/wp-content/uploads

脚本示例:

find /home/ -type d -name uploads -exec sh -c 'zip -r /backup/uploads/alluploads.zip `dirname $0`/`basename $0`' {} \;

这种方法的问题在于它全部写入一个 zip 文件。如何更改此设置以将每个用户上传的内容保存到自己的 user1-uploads.z​​ip 文件中?

我玩过 exec 和 sed,但我似乎无法弄清楚。这是我得到的最好的——只是想让它呼应这个名字——但这是不对的。对不起,我对正则表达式很糟糕:

find /home/ -type d -name uploads -exec sh -c 'string=`dirname $0` echo $string | sed `/\/home\/\(.*\)\/new\/wp-content\/uploads/`'{} \;

对于如何解决此问题的任何帮助或指导,我们将不胜感激。谢谢!

【问题讨论】:

  • 这似乎是您关于堆栈溢出的第一个问题。对清晰、简洁和代码示例的赞誉。

标签: regex bash ssh sed


【解决方案1】:

您可以使用 Bash 的 globbing 和 * 来展开所有不同的用户目录。

for uploads in /home/*/public_html/wp-content/uploads; do
    IFS=/ read -r _ _ user _ <<<"$uploads"
    zip -r /backup/uploads/${user}.zip "$uploads"
done

【讨论】:

  • 谢谢,这也是一个很好的解决方案,正是我所要求的。
【解决方案2】:

想到了几个解决方案,您可以遍历用户目录:

cd /home
for udir in *; do
   find /home/$udir -type d -name uploads -exec sh -c 'zip -r /backup/uploads/'"$udir"'-uploads.zip `dirname $0`/`basename $0`' {} \;
done

或者使用cut获取路径的第二个元素:

find /home/ -type d -name uploads -exec sh -c 'zip -r /backup/uploads/`echo "$0" | cut -d/ -f 2`-uploads.zip `dirname $0`/`basename $0`' {} \;

尽管如果用户在其主页下的任何位置有多个名为 uploads 的目录,这两种方法都会遇到问题

您可以使用 tr 简单地将路径分隔符替换为另一个字符,这样您最终会为每个 uploads 目录提供一个单独的 zip:

find /home/ -type d -name uploads -exec sh -c 'zip -r /backup/uploads/`echo $0 | tr "/" "-"`.zip `dirname $0`/`basename $0`' {} \; 

所以你最终会得到名为 /backup/uploads/home-user-wp-content-uploads.zip/backup/uploads/home-user-wip-uploads.zip 的文件,而不是一个 zip 覆盖另一个

【讨论】:

  • 谢谢 - 我喜欢用破折号替换斜杠的想法,这样备份的位置就很明显了,以防它不在正常位置。有没有一种简单的方法可以在回家前摆脱第一个破折号,因为 /home/ 中的第一个斜杠,我将它保存为 /backup/uploads/-home-user-wp-content-uploads.zip - 否则它非常适合我的需要。
  • 你可以cd /find home ..... 这样就不会有前导斜杠,或者用sed -e "s=^/==;s=/=-=g" 替换tr "/" "-" 以删除前导斜杠
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多