首先直接放出最终代码
放在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"
|