实用shell脚本分享

1.批量修改文件的前缀和后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/zsh
echo "请输入重命名文件夹所在的目录"
read dir

if [ !-d "$dir" ]
then
echo "目录不存在"
exit 1
fi
echo "前缀"
read prefix
echo "后缀"
read suffix

cd "$dir"

for file in *
do
if [ -d "$file" ]
then
continue
fi
ext="${file##*.}"
base="${file%.*}"

new_name="${prefix}${base}${suffix:+.$suffix}"
mv "$file" "$new_name"
echo "重命名:$file->$new_name"
done
echo "完成!"

2.onedrive上传脚本

1
2
3
4
5
#!/bin/zsh
cd ~/app/onedrive-2.5.2
./onedrive --sync
echo "onedrive同步成功"

3.备份数据库

年月日和时分秒之间的_不能丢

变量可以用{}包围,用来界定范围

脚本编写的第一部分:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/zsh
BACKUP=/data/backup/db
DATATIME=$(date +%Y-%m-%d_%H:%M:%S)
echo $DATATIME

HOST=LOCALHOST
DB_USER=root
PASSWD=admin
DB_NAME=test1

[ ! -d "${BACKUP}/${DATATIME}" ] && sudo mkdir -p "${BACKUP}/${DATATIME}"
1
[ ! -d "${BACKUP}/${DATATIME}" ] && sudo mkdir -p "${BACKUP}/${DATATIME}"

这句话用来创建目录

在这里面datatime只能被赋值一次,所以就是第一次的时间,不会存在其他的时间的

1
2
3
4
5
6
7
❯ sudo ./mysql_db_backup.sh
2024-10-04_17-28-14
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2024-10-04_17-28-14/
2024-10-04_17-28-14/2024-10-04_17-28-14.sql.gz
数据库备份成功,备份文件为: /data/backup/db/2024-10-04_17-28-14/2024-10-04_17-28-14.sql.gz

运行成功截图,中间的提示错误为密码的保护问题,可以先暂时不用管

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/zsh

# 备份路径
BACKUP=/data/backup/db

# 当前时间,替换 ":" 为合法符号
DATATIME=$(date +%Y-%m-%d_%H-%M-%S)
echo $DATATIME

# 数据库信息
HOST=LOCALHOST
DB_USER=root
PASSWD=admin
DB_NAME=test1

# 检查并创建备份目录
[ ! -d "${BACKUP}/${DATATIME}" ] && sudo mkdir -p "${BACKUP}/${DATATIME}"

# 使用 sudo 提升权限来执行备份
sudo mysqldump -u${DB_USER} -p${PASSWD} --host=${HOST} -q -R ${DB_NAME} | sudo gzip > ${BACKUP}/${DATATIME}/$DATATIME.sql.gz

cd ${BACKUP}
tar -zcvf $DATATIME.tar.gz ${DATATIME}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库备份成功,备份文件为: ${BACKUP}/${DATATIME}/${DATATIME}.sql.gz"
else
echo "数据库备份失败"
fi
sudo rm -rf ${BACKUP}/${DATATIME}

但是这样的话其实压缩包里面还有一个压缩包

但是不压缩两次的话,里面的东西会溢出来捏

这样我们还要把10天以前的文件给删除,否则会占满空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/zsh

# 备份路径
BACKUP=/data/backup/db

# 当前时间,替换 ":" 为合法符号
DATATIME=$(date +%Y-%m-%d_%H-%M-%S)
echo $DATATIME

# 数据库信息
HOST=LOCALHOST
DB_USER=root
PASSWD=admin
DB_NAME=test1

# 检查并创建备份目录#!/bin/zsh

# 备份路径
BACKUP=/data/backup/db

# 当前时间,替换 ":" 为合法符号
DATATIME=$(date +%Y-%m-%d_%H-%M-%S)
echo $DATATIME

# 数据库信息
HOST=LOCALHOST
DB_USER=root
PASSWD=admin
DB_NAME=test1

# 检查并创建备份目录
[ ! -d "${BACKUP}/${DATATIME}" ] && sudo mkdir -p "${BACKUP}/${DATATIME}"

# 使用 sudo 提升权限来执行备份
sudo mysqldump -u${DB_USER} -p${PASSWD} --host=${HOST} -q -R ${DB_NAME} | sudo gzip > ${BACKUP}/${DATATIME}/$DATATIME.sql.gz

cd ${BACKUP}
tar -zcvf $DATATIME.tar.gz ${DATATIME}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库备份成功,备份文件为: ${BACKUP}/${DATATIME}/${DATATIME}.sql.gz"
else
echo "数据库备份失败"
fi
sudo rm -rf ${BACKUP}/${DATATIME}

find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "win"

得到完整代码

return

1
2
3
4
5
6
7
8
❯ sudo ./mysql_db_backup.sh
2024-10-04_17-39-22
2024-10-04_17-39-22
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2024-10-04_17-39-22/
2024-10-04_17-39-22/2024-10-04_17-39-22.sql.gz
数据库备份成功,备份文件为: /data/backup/db/2024-10-04_17-39-22/2024-10-04_17-39-22.sql.gz
win

最后的最后我们准备进行定时任务了

使用crontab

1
❯ crontab -e

进入编辑

然后

1
30 2 * * * ~/shellcode/mysql_db_backup.sh

完成任务

在这里面最好使用绝对路径,我懒了就不该了哈哈