你是否因为pdf巨大而通过外链导入,却因为pdf本体移动而导致ob所有关联这个pdf 的链接失效而苦恼?
现在,我抛砖引玉,给出了我的解决方案:使用Mac自带的替身功能,实现插入pdf的替身
优点:
- pdf替身文件很小,不会造成库体积异常变大
- 无论本体pdf在哪(除非删除),链接都不会失效
- 与硬链接的区别(主要在同步上)
1.软链硬链在本体都使用同一份文件,但是硬链在同步的时候,会照常上传完整的pdf文件,导致同步缓慢
2.硬链可能会遗留幽灵文件
3.如果想要同步在另一个设备上也看,可以使用硬链功能
因本人水平有限,缺点如下:
- 目前通过脚本运行
- 同步库文件只能同步替身,不能同步本体
- 适合固定的附件文件夹
- 开启obsidian 显示所有类型附件的设置
- 插入后需要手动引用
- 可以通过添加全局环境变量来快速使用脚本
使用方法:
- 先新建脚本文件
- 更改自己的附件文件夹路径 TARGET_DIR
- 为脚本添加可执行权限
chmod +x pdf_alias_manager.sh
- 把脚本拖入终端,然后在后面拖入要应用的pdf,脚本会自动在仓库的附件文件夹下创建替身文件
- 愉快的在笔记中进行引用吧
本人水平实在有限,下面是在实现想法的过程中遇到的困难,最终只能通过外部脚本途径解决,如果有大佬看到能解决开发一个插件便最好不过:
遇到的困难:
- 手动制作替身后,如果直接拖入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 "$@"