You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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能识别的格式:

  1. 移除.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)),"")
    
  2. 统一路径格式:用查找替换去掉Windows盘符,把路径分隔符\改成Linux标准的/。
  3. 保存注意事项:把处理好的数据导出成文本文件后,必须在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/
  • 脚本会自动跳过表头行,每创建一个链接都会输出日志,方便追踪进度

常见问题与修复技巧

转换后难免会出现失效链接,主要原因有两个:

  1. 大小写差异:Windows不区分文件名大小写,但Linux严格区分,比如Sub-Folder_A和Sub-folder_a会被Linux当成两个不同路径
  2. 特殊符号问题:文件名里的特殊字符(比如空格、&、#)可能导致格式异常

我的个人修复技巧:先修改文本文件,把所有链接都生成到同一个临时目录下,这样能快速排查失效链接的原因,修复文本文件后再按原路径重新运行脚本,效率会高很多。

内容的提问来源于stack exchange,提问作者h4g3-Lawson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:37:53