Mac通过制作替身导入pdf来使pdf本体移动链接不会失效

你是否因为pdf巨大而通过外链导入,却因为pdf本体移动而导致ob所有关联这个pdf 的链接失效而苦恼?
现在,我抛砖引玉,给出了我的解决方案:使用Mac自带的替身功能,实现插入pdf的替身

:smiling_face_with_three_hearts:优点:

  1. pdf替身文件很小,不会造成库体积异常变大
  2. 无论本体pdf在哪(除非删除),链接都不会失效
  3. 与硬链接的区别(主要在同步上)
    1.软链硬链在本体都使用同一份文件,但是硬链在同步的时候,会照常上传完整的pdf文件,导致同步缓慢
    2.硬链可能会遗留幽灵文件
    3.如果想要同步在另一个设备上也看,可以使用硬链功能

:face_holding_back_tears:因本人水平有限,缺点如下:

  1. 目前通过脚本运行
  2. 同步库文件只能同步替身,不能同步本体
  3. 适合固定的附件文件夹
  4. 开启obsidian 显示所有类型附件的设置
  5. 插入后需要手动引用
  6. 可以通过添加全局环境变量来快速使用脚本

:sunglasses:使用方法:

  1. 先新建脚本文件
  2. 更改自己的附件文件夹路径 TARGET_DIR
  3. 为脚本添加可执行权限 chmod +x pdf_alias_manager.sh
  4. 把脚本拖入终端,然后在后面拖入要应用的pdf,脚本会自动在仓库的附件文件夹下创建替身文件
  5. 愉快的在笔记中进行引用吧

:sob:本人水平实在有限,下面是在实现想法的过程中遇到的困难,最终只能通过外部脚本途径解决,如果有大佬看到能解决开发一个插件便最好不过:

遇到的困难:

  • 手动制作替身后,如果直接拖入obsidian进行导入,则导致该替身失效;如果通过访达放入附件文件夹,则功能正常

#!/bin/bash

# PDF替身管理器脚本
# 功能:为拖入的PDF创建替身,重命名为"附件-原本的文件名.pdf的替身"并移动到指定文件夹

# 配置变量
TARGET_DIR="这里是自己库的附件路径"
LOG_FILE="/tmp/pdf_alias_manager.log"

# 创建目标目录(如果不存在)
mkdir -p "$TARGET_DIR"

# 日志函数
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 显示通知函数(macOS)
show_notification() {
    osascript -e "display notification \"$1\" with title \"PDF替身管理器\""
}

# 主处理函数
process_pdf() {
    local original_pdf="$1"
    
    # 检查文件是否存在
    if [[ ! -f "$original_pdf" ]]; then
        log_message "错误:文件不存在 - $original_pdf"
        show_notification "错误:文件不存在"
        return 1
    fi
    
    # 检查是否为PDF文件
    if [[ "$original_pdf" != *.pdf && "$original_pdf" != *.PDF ]]; then
        log_message "错误:不是PDF文件 - $original_pdf"
        show_notification "错误:请拖入PDF文件"
        return 1
    fi
    
    # 获取文件名(不含路径和扩展名)
    local filename=$(basename "$original_pdf" .pdf)
    local filename=$(basename "$filename" .PDF)
    
    # 构建新文件名 - 修改为"附件-原本的文件名.pdf的替身"
    local new_filename="附件-${filename}.pdf的替身"
    local alias_path="$TARGET_DIR/$new_filename"
    
    # 检查是否已存在同名文件
    if [[ -e "$alias_path" ]]; then
        log_message "警告:文件已存在,跳过 - $alias_path"
        show_notification "文件已存在,跳过处理"
        return 0
    fi
    
    # 创建替身
    log_message "正在创建替身:$original_pdf -> $alias_path"
    
    # 方法1:使用osascript(macOS原生替身)
    osascript <<EOF
    tell application "Finder"
        set sourceFile to POSIX file "$original_pdf" as alias
        set targetFolder to POSIX file "$TARGET_DIR" as alias
        set newAlias to make new alias file to sourceFile at targetFolder
        set name of newAlias to "$new_filename"
    end tell
EOF

    # 检查是否创建成功
    if [[ $? -eq 0 && -e "$alias_path" ]]; then
        log_message "成功创建替身:$alias_path"
        show_notification "已创建PDF替身:$new_filename"
        
        # 在终端输出结果
        echo "✅ 成功创建PDF替身:"
        echo "   原文件:$original_pdf"
        echo "   替身文件:$alias_path"
        
        return 0
    else
        log_message "错误:创建替身失败 - $original_pdf"
        show_notification "创建替身失败"
        return 1
    fi
}

# 使用方法说明
show_usage() {
    echo "PDF替身管理器"
    echo "使用方法:"
    echo "  1. 直接将PDF文件拖拽到此脚本上"
    echo "  2. 或在终端运行:$0 /path/to/your/file.pdf"
    echo ""
    echo "目标目录:$TARGET_DIR"
    echo "日志文件:$LOG_FILE"
    echo "文件名格式:附件-原文件名.pdf的替身"
}

# 主程序
main() {
    log_message "脚本启动,参数:$*"
    
    # 如果没有参数,显示使用方法
    if [[ $# -eq 0 ]]; then
        show_usage
        # 如果是拖拽操作,等待用户输入
        echo "请将PDF文件拖拽到此处,然后按回车..."
        read -r dragged_file
        if [[ -n "$dragged_file" ]]; then
            # 清理拖拽路径(移除可能的引号和空格)
            dragged_file=$(echo "$dragged_file" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e "s/^['\"]//" -e "s/['\"]$//")
            process_pdf "$dragged_file"
        else
            show_usage
        fi
    else
        # 处理所有参数(支持批量处理)
        for file_path in "$@"; do
            # 清理路径
            clean_path=$(echo "$file_path" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e "s/^['\"]//" -e "s/['\"]$//")
            process_pdf "$clean_path"
        done
    fi
    
    log_message "脚本执行完成"
}

# 运行主程序
main "$@"

1 个赞