我正在使用Obsidian 的 Shell 命令插件做很多事情,例如运行latexmk
通过 LaTeX 将 Markdown 文件转换为 PDF 以呈现引文。
现在,我正在尝试创建一个命令,根据 frontmatter 变量将 Vault 中的文件(Obsidian 打开的文件夹,与 VScode 中的非常相似)移动到同一 Vault 中的另一个位置。例如,如果它有,Medium: Book
它也会移动它Book Log
,如果它有,Medium: Movie
它会将它移动到其他地方。
我的问题是a)我不确定我的语法是否正确,b)在我需要使用插件特定变量(例如{{file_name}}
)和插件只能处理单行的事实之间,我不是确定问题出在哪里。
作为一句话,当我将它放入插件中时,它看起来像这样:
case {{file_name}} in 2*) : ;; *) mv {{file_path:absolute}} {{folder_path:absolute}}/{{date:YYYY-MM-DD}}\ {{file_name}} ;; esac; case {{yaml_value:Medium}} in Book | Audiobook | Podcast | eBook | GraphicNovel) mv {{file_path:absolute}} {{vault_path}}/Book\ Log/{{date:YYYY}}/{{date:MM}}/{{file_name}} ;; Movie | TV | Game) mv {{file_path:absolute}} {{vault_path}}/Movies\ and\ Games/{{date:YYYY}}/{{date:MM}}/{{file_name}};; esac
如果有换行符,它看起来像这样:
case {{file_name}} in
2*) : ;;
*) mv {{file_path:absolute}} {{folder_path:absolute}}/{{date:YYYY-MM-DD}}\ {{file_name}} ;;
esac;
case {{yaml_value:Medium}} in
Book | Audiobook | Podcast | eBook | GraphicNovel) mv {{file_path:absolute}} {{vault_path}}/Book\ Log/{{date:YYYY}}/{{date:MM}}/{{file_name}} ;;
Movie | TV | Game) mv {{file_path:absolute}} {{vault_path}}/Movies\ and\ Games/{{date:YYYY}}/{{date:MM}}/{{file_name}};;
esac; exit;
exec bash
该脚本的目的是做两件事:使用当前日期重命名文件(如果文件还没有日期前缀),并将其移动到正确的位置。在当前的上述版本中,它在一次执行时执行其中之一,但不能同时执行两者。即,如果文件以除 a 以外的任何内容开头,2*
则它会以日期为前缀。当且仅当它已经有一个日期(无论是手动将其放在那里还是第一次执行此命令),它才会将该文件移动到正确的位置。我希望这一步就能完成。
mv
我的怀疑是,第一个之后的步骤不知何故esac
被解析为第二个案例的一部分,但我不知道如何防止这种情况。
任何建议表示赞赏!谢谢 :)
编辑:我采纳了 Steeldiver 的建议并尝试直接在 bash 中重写它,但我仍然遇到麻烦:
#!/bin/bash
fileName=$1
f10="${fileName:0:10}"
today=$(date +"%Y-%m-%d")
year=$(date +"%Y")
month=$(date +"%m")
if [[ $f10 != [0-9]* ]] ; then
if grep -E '(Book|Audiobook|Podcast|eBook|GraphicNovel)' $1 ; then
mv $1 "/home/Documents/Obsidian/Books and Movies/Book Log/$year/$month/$today $1"
elif grep -E '(Movie|TV|Game)' $1 ; then
mv $1 "/home/Documents/Obsidian/Books and Movies/Movies and Games/$year/$month/$today $1"
fi
elif [[ $f10 = [0-9]* ]] ; then
if grep -E '(Book|Audiobook|Podcast|eBook|GraphicNovel)' $1 ; then
mv $1 "/home/Documents/Obsidian/Books and Movies/Book Log/$year/$month/$1"
elif grep -E '(Movie|TV|Game)' $1 ; then
mv $1 "/home/Documents/Obsidian/Books and Movies/Movies and Games/$year/$month/$1"
fi
fi
除了由于嵌套而有点不优雅之外if
(我不知道如何case
在这里使用,我收到了这个错误:
bash 2.sh "2023-09-05 aaa.md"
grep: 2023-09-05: No such file or directory
grep: aaa.md: No such file or directory
grep: 2023-09-05: No such file or directory
grep: aaa.md: No such file or directory
有任何想法吗?