slug: mac-fswatch-shell-implementation-jian-yue-markdown-export-to-obsidian
datetime: 2024-03-03 13:25
summary: 配置下载文件的路径和仓库文件夹路径,通过脚本自动将下载的Markdown文件移动到指定文件夹中,并可选择手动或自动保存路径
tags: 路径配置, 脚本移动文件, 手动或自动保存路径
cover_image_url: "https://images.unsplash.com/photo-1522881451255-f59ad836fdfb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wzNjAwOTd8MHwxfHNlYXJjaHw5fHxzY3JpcHR8ZW58MHx8fHwxNzA5NDM4ODk1fDA&ixlib=rb-4.0.3&q=80&w=1080"
Mac下fswatch+shell实现简悦导出markdown到obsidian
选择好目录后,shell 脚本会自动把刚才下载的 markdwon 文件移动到你选择的文件夹内;
选择取消,退出话框,不移动文件。
具体配置下面会讲。
源代码如下:
#!/bin/bash
# nohup /Users/yourname/bin/mdwatch.sh >/dev/null 2>&1 &
# * * * * * /bin/bash /Users/yourname/bin/mdwatch.sh >/dev/null 2>&1 &
# 配置下载文件的路径和你的仓库文件夹路径
# 你的fswatch的安装路径,必须是绝对路径
fswatch="/usr/local/bin/fswatch"
# 下载文件的目录,后面不加/
downloads_dir="/Users/yourname/Downloads"
# 你仓库的目录(注意不是文件夹的目录),后面不加/
vault_dir="/Users/yourname/Data/我的笔记"
folder_dir="" # 文件夹的路径(相对路径),为空为根目录,前面不要加/
manual='yes' # 是否手动选择保存? yes,则每次都要手动选择保存的文件夹,no,则自动保存到folder_dir变量指定的目录里
# 如果已启动则退出
pid=$(pgrep -f fswatch)
if [ -n "$pid" ]; then
echo "已在运行,请不要重复启动!"
exit 1
fi
# 监控文件夹变化
$fswatch -x --event Created "$downloads_dir" | while read line; do
# 获取文件名
file=$(echo "$line" | awk -F ' Created' '{print $1}') # /xx/yy/zz.md
# 判断是否为md文件
if [[ "$file" =~ \.md$ ]]; then
target_dir=""
# 获取文件夹路径
if [ "$manual" == "yes" ]; then
# 手动选择
result=$(find "$vault_dir" -not -path '*/\.*' -type d -exec printf "%s/\n" {} + | sed "s|^$vault_dir||")
result=$(echo $result)
# 使用 IFS 空格来分割字符串,并将结果赋值给数组
IFS=' ' read -ra options <<< "$result"
# 将Bash数组转换为AppleScript可接受的格式
escaped_options=$(IFS=','; echo "${options[*]}" | sed 's/,/","/g;s/^/"/;s/$/"/')
# 使用AppleScript弹出选择列表
read -r selectedOption < <(osascript -e "
tell application \"System Events\"
activate
set userChoice to choose from list (${escaped_options}) with title \"请选择目标文件夹\" with prompt \"请选择:\"
return userChoice as text
end tell
")
if [ "$selectedOption" == "false" ]; then
echo "用户放弃了文件移动"
# osascript -e 'display dialog "您放弃了本次移动,您可以去下载文件夹手动移动!" buttons {"好的"} default button 1 with title "温馨提醒"'
else
target_dir="${vault_dir}${selectedOption}"
fi
else
# 固定目录
target_dir="$vault_dir/$folder_dir"
fi
# 移动文件,文件存在时重命名为副本
if [ "$target_dir" != "" ]; then
if [ ! -d "$target_dir" ]; then
echo "${target_dir}不存在!"
osascript -e "display alert \"${target_dir}不存在!\" buttons {\"好的\"} default button 1"
continue
fi
filename=$(echo "$file" | awk -F '/' '{print $NF}') # zz.md
if [ -f "$target_dir/$filename" ]; then
ext=$(echo "$filename" | cut -d'.' -f2) # md
filenameonly=$(echo "$filename" | cut -d'.' -f1) # zz
current_date=$(date +%Y%m%d%H%M%S)
random_number=$(( (RANDOM % 1000) + 1 ))
echo "文件{$filename}改名成了$filenameonly-副本-$current_date-$random_number.$ext"
mv "$file" "$target_dir/$filenameonly-副本-$current_date-$random_number.$ext"
else
mv "$file" "$target_dir/"
fi
echo "$filename 已保存成功!"
osascript -e "display notification \"$filename 已保存成功!\" with title \"提示:\""
fi
fi
done
folder_dir="网页剪藏"
即可,下级目录这样配置 folder_dir="网页剪藏/图片收藏"
,注意,路径前面不要加/brew install fswatch
安装即可chmod u+x mdwatch.sh
即可),但这种方式有一个黑色命令行窗口在终端里,且每次使用时需要打开crontab -e
,打开 vim 编辑窗口,输入 * * * * * /bin/bash /Users/yourname/bin/mdwatch.sh >/dev/null 2>&1 &
后保存即可。这里的 mdwatch.sh 脚本路径需要改成自己的。fgrep fswatch
命令,能正确显示 fswatch 进程号即正常运行fgrep fswatch
找到进程号,再通过 kill 进程号
杀死进程,fswatch 进程退出后 mdwatch.sh 会自动退出,反过来不会。注意:如果要彻底不需要了,还需要把 crontab 里的定时任务删除。nohup /Users/yourname/bin/mdwatch.sh >/dev/null 2>&1 &
即可看似复杂,其实很简单,因为掺杂了很多说明文字,所以显得复杂。
如果想马上运行,执行 nohup /Users/yourname/bin/mdwatch.sh
即可。