【编程学习】利用shell脚本解决图床链接自动化更换问题

首先直接放出最终代码

放在replace_url.sh文件中,然后运行bash replace_url.sh 即可,别忘了这个只能在bash中运行,windowscmd是不行的,可以打开git bash后再运行。

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
#!/bin/bash

# 备份旧的IFS变量
OLDIFS="$IFS"
IFS=$'\n' # 修改分隔符为换行符

before="https:\/\/cdn.jsdelivr.net"
after="https:\/\/jsd.onmicrosoft.cn"

# 计算当前目录下.md文件的数量
file_count=$(find . -type f -name "*.md" | wc -l)
count=0

# 开始处理文件并显示进度
echo "正在进行文件处理..."
for md_file in $(find . -type f -name "*.md"); do
((count++))
# 替换文件中的URL前缀
sed -i "s|$before|$after|g" "$md_file"

# 计算进度百分比
progress=$(( (count * 100) / file_count ))

# 计算进度条的长度,这里设置为50个字符
bar_length=50
filled_length=$(( (bar_length * progress) / 100 ))

# 显示进度条,使用\r来回到行首,不换行显示
echo -ne "进度: [$(printf "%${filled_length}s" | tr ' ' '=')>] ${progress}% (文件: ${count}/${file_count}) \r"
done

# 完成进度显示
echo -e "\n文件处理完成"

# 恢复旧的IFS变量
IFS="$OLDIFS"

效果展示

其实速度并不算快,但是能够自动化就已经提高了太多的效率。

replace_url

详细解释

字符串替换方法sed

在shell中,我们使用sed -i进行文件文本的替换

1
sed -i "s|before|after|g" "test.txt"

通过这句命令行,我们可以将test.txt文件中的所有“before”字符串转化为“after”字符串;其中,s代表“替换指定字符”,g代表“表示行内全面替换”。

其中一些详细参数可以在这里看看:

通过循环遍历目录下的md文件,然后对每个文件进行处理

1
2
3
for md_file in $(find . -type f -name "*.md"); do
sed -i "s|before|after|g" "$md_file"
done

分隔符更换

由于我的文件名中有空格,这样会导致在遍历md_file时,程序将空格也当作分隔符,导致文件名的获取出问题。因此,需要修改全局变量IFS,将其改为\n换行符,当然别忘了保留原来的IFS,并在最后换回来。

1
2
3
4
OLDIFS="$IFS"
IFS=$'\n' # 修改分隔符为换行符

IFS="$OLDIFS"

文件数量统计

在这里,我们需要统计当前目录下所有.md文件。

其中find . -type f -name "*.md"含义为找到目录下所有md文件并输出,然后将输出通过|管道送给wc命令,然后按行计数,如此就实现了文件数量的统计。

1
file_count=$(find . -type f -name "*.md" | wc -l)

进度条实现

没啥说的,可以学会这个模板直接用。

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
#!/bin/bash

# 备份旧的IFS变量
OLDIFS="$IFS"
IFS=$'\n' # 修改分隔符为换行符

# 计算当前目录下.md文件的数量
file_count=$(find . -type f -name "*.md" | wc -l)
count=0

# 开始处理文件并显示进度
echo "正在进行文件处理..."
for md_file in $(find . -type f -name "*.md"); do
((count++))

# 计算进度百分比
progress=$(( (count * 100) / file_count ))

# 计算进度条的长度,这里设置为50个字符
bar_length=50
filled_length=$(( (bar_length * progress) / 100 ))

# 显示进度条,使用\r来回到行首,不换行显示
echo -ne "进度: [$(printf "%${filled_length}s" | tr ' ' '=')>] ${progress}% (文件: ${count}/${file_count}) \r"
done

# 恢复旧的IFS变量
IFS="$OLDIFS"