首先直接放出最终代码
放在replace_url.sh文件中,然后运行bash replace_url.sh 即可,别忘了这个只能在bash中运行,windows的cmd是不行的,可以打开git bash后再运行。
| 12
 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"
 
 | 
效果展示
其实速度并不算快,但是能够自动化就已经提高了太多的效率。

详细解释
字符串替换方法sed
在shell中,我们使用sed -i进行文件文本的替换
| 1
 | sed -i "s|before|after|g" "test.txt"
 | 
通过这句命令行,我们可以将test.txt文件中的所有“before”字符串转化为“after”字符串;其中,s代表“替换指定字符”,g代表“表示行内全面替换”。
其中一些详细参数可以在这里看看:
通过循环遍历目录下的md文件,然后对每个文件进行处理
| 12
 3
 
 | for md_file in $(find . -type f -name "*.md"); dosed -i "s|before|after|g" "$md_file"
 done
 
 | 
分隔符更换
由于我的文件名中有空格,这样会导致在遍历md_file时,程序将空格也当作分隔符,导致文件名的获取出问题。因此,需要修改全局变量IFS,将其改为\n换行符,当然别忘了保留原来的IFS,并在最后换回来。
| 12
 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)
 | 
进度条实现
没啥说的,可以学会这个模板直接用。
| 12
 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"
 
 |