Bash脚本备份服务器上载文件夹

时间:2014-07-17 21:19:49

标签: regex bash ssh sed

我有一个运行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/`'{} \;

非常感谢有关如何解决此问题的任何帮助或指示。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将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

答案 1 :(得分:1)

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

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覆盖另一个