如何使用Bash脚本批量将Windows快捷方式(.lnk)转换为Linux链接
批量转换Windows .lnk快捷方式为Linux链接的完整方案
问题背景
刚切换到Linux系统时,我发现个人和工作归档里堆着超过1100个Windows .lnk快捷方式——这些快捷方式是归档正常使用的关键,不能直接删掉,得转成Linux能识别的链接。之前已经摸透了ln命令,还用Shortcut Search and Replace工具把所有快捷方式的NAME、TARGET、PATH信息提取成了文本,再导入Excel做了格式调整,处理后的数据是这样的(制表符分隔):
NAME TARGET PATH 0_Shortcut-name1 Library/Subject/Sub-folder_a/Sub-Sub-Folder Library/Subject/Sub-folder_b 0_Shortcut-name2 Library/Subject/Sub-folder_a/image.png Library/Subject/Sub-folder_b 0_Shortcut-name3 Library/Subject/Sub-folder_a/notes.txt Library/Subject/Sub-folder_b 0_Shortcut-name4 Library/Subject/Sub-folder_a/document.docx Library/Subject/Sub-folder_b 0_Shortcut-name5 Library/Subject/Sub-folder_a/document.pdf Library/Subject/Sub-folder_b
前期预处理步骤
在生成脚本之前,得先把Excel里的数据处理成Linux能识别的格式:
- 移除.lnk后缀:因为第一列已经是快捷方式名称,要去掉原始的.lnk后缀。假设Name、Target、Path分别在A、B、C列,在D列用这个公式下拉就能搞定:
=SUBSTITUTE(SUBSTITUTE(C1,"","@",LEN(C1)-LEN(SUBSTITUTE(C1,"",""))),RIGHT(SUBSTITUTE(C1,"","@",LEN(C1)-LEN(SUBSTITUTE(C1,"",""))),(LEN(C1)-FIND("@",SUBSTITUTE(C1,"","@",LEN(C1)-LEN(SUBSTITUTE(C1,"",""))))+1)),"") - 统一路径格式:用查找替换去掉Windows盘符,把路径分隔符
\改成Linux标准的/。 - 保存注意事项:把处理好的数据导出成文本文件后,必须在Linux下用支持换行格式的编辑器打开,保存时选择Linux/Unix换行格式——否则脚本会因为换行符问题跑不起来!
最终Bash脚本解决方案
感谢Renaud Pacalet提供的核心思路,我在此基础上优化了脚本,满足自定义前缀、可选硬链接的需求:
#!/bin/bash # 默认配置:符号链接,前缀/mnt/ prefix='/mnt/' link_option='-s' # 解析命令行参数 while getopts "hp:" opt; do case $opt in h) link_option='' ;; # 使用硬链接,去掉ln的-s参数 p) prefix="$OPTARG" ;; \?) echo "错误:无效选项 -$OPTARG" >&2; exit 1 ;; esac done # 检查输入文件是否提供 if [ $# -lt $OPTIND ]; then echo "用法:$0 [-h] [-p 路径前缀] <制表符分隔文件路径>" echo " -h: 创建硬链接(默认创建符号链接)" echo " -p: 指定路径前缀,比如/mnt/或/media/(默认/mnt/)" exit 1 fi input_file=${@:$OPTIND} # 逐行处理数据,跳过表头 while IFS=$'\t' read -r name target path; do if [ "$name" = "NAME" ]; then continue fi # 拼接完整路径 full_target="${prefix}${target}" full_link="${prefix}${path}/${name}" # 创建链接并输出日志 ln $link_option "$full_target" "$full_link" && echo "已创建链接:$full_link -> $full_target" done < "$input_file"
脚本使用说明
- 默认创建符号链接,加
-h选项即可创建硬链接:./convert_lnk.sh -h -p /media/ my_shortcuts.txt - 用
-p自定义前缀,比如你的归档挂载在/media/archive/,就传-p /media/archive/ - 脚本会自动跳过表头行,每创建一个链接都会输出日志,方便追踪进度
常见问题与修复技巧
转换后难免会出现失效链接,主要原因有两个:
- 大小写差异:Windows不区分文件名大小写,但Linux严格区分,比如
Sub-Folder_A和Sub-folder_a会被Linux当成两个不同路径 - 特殊符号问题:文件名里的特殊字符(比如空格、&、#)可能导致格式异常
我的个人修复技巧:先修改文本文件,把所有链接都生成到同一个临时目录下,这样能快速排查失效链接的原因,修复文本文件后再按原路径重新运行脚本,效率会高很多。
内容的提问来源于stack exchange,提问作者h4g3-Lawson
相关产品推荐
相关产品推荐

