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

详细解释
字符串替换方法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"
   |