一个备份数据库的脚本

假设每个网站的目录都是www开头的,数据库的名字是域名,www开头,不带后缀的形式。比如 www.shelljiaocheng.com 的数据库名字是 www_shelljiaoben。

#/bin/bash

SITEDIR=/data/sitedir

cd SITEDIR

ans="yes"

for site in `ls -d www*`
do
    cdSITEDIR
    db_name=(echo "site" | cut -d '.' -f -2 | sed 's/\./_/g')
    echo db_name


    mysql -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='db_name';" | grep -q "db_name"

    if [? -eq 0 ]; then
        cd site
        mysqldumpdb_name > 20241029.sql
        if [ ? = 0 ]; then
            echodb_name 备份成功
        else
            echo db_name 备份失败
        fi
    else
        echo "数据库db_name 不存在。"
        echo db_name >> ~/tmp.txt
        ans=db_name
    fi

done

echo "\ans =ans"
cd ~

通过 find , tar 对多个文件进行打包

服务器上放了几个小站,计划打包备份一下,通过一句命令,分别打包压缩每个一个网站。

 find /data/website -maxdepth 1 -type d  -name "www*" \
 -exec sh -c 'tar  -czf "{1##/data/website/}.tar.gz"\
 --transform="s,data/website/,,"  "1"' _ {} \;

命令含义

这个命令的作用是在/data/website目录下查找深度为 1(即只在当前层级查找)、类型为目录且名称以 “www” 开头的所有目录,并对每个找到的目录执行一个命令来进行打包压缩。

以下是对命令的详细解释:

find

find /data/website -maxdepth 1 -type d -name "www":
find命令用于在指定目录中查找文件和目录。
/data/website是查找的起始目录。
-maxdepth 1表示只在当前目录层级查找,不深入子目录。
-type d指定查找的类型为目录。
-name "www
"表示查找名称以 “www” 开头的目录。

-exec 是find的一个参数,表示对查找到的结果,执行命令

-exec sh -c 'tar -czf "{1##/data/website/}.tar.gz" --transform="s,data/website/,," "1"' _ {} \;:
-exec选项用于对找到的每个文件或目录执行指定的命令。
sh -c表示执行一个 shell 命令。
tar -czf "{1##/data/website/}.tar.gz":使用tar命令进行压缩,生成的压缩文件名是去掉/data/website/前缀后的目录名加上.tar.gz后缀。例如,如果找到的目录
是/data/website/www_example,则生成的压缩文件名为www_example.tar.gz。

--transform="s,data/website/,,":在压缩过程中,使用sed风格的替换表达式,将路径中的data/website/替换为空,从而在压缩文件中不包含这个路径部分。
"1"表示find命令找到的目录路径,作为tar命令的参数传入。
_ {}中的_是一个占位符,{}表示find命令找到的当前文件或目录,在这个命令中代表找到的以 “www” 开头的目录。
\;表示-exec选项的结束标志。

一条sed语句,节省两个小时

朋友一台服务器上,好几十个网站,更换服务器的时候,nginx 做了升级,修改很多配置文件。最后添加域名的时候,少了 添加了 裸域名。 比如 应该是

server_name shelljiaoben.com www.shelljiaoben.com;

全部配置成了

server_name www.shelljiaoben.com;

通过 sed 一行修改全部的配置及文件

sed  -i -r '/server_name/s/www\.([^ ]+);/\1 &/g' *.conf

含义
1. -i 表示修改后直接保存源文件
2. -r 表示使用启用扩展的正则表达式语法
3. /server_name/ 表示指定到好汉 server_name 的行
4. s 表示提示
5. ([^ ]+) 除去空白字符的其他字符
6. \1 匹配第一个括号内的内容
7. & 表示 www\.([^ ]+); 的内容