Obsidian 中的 Bash 脚本:用于重命名文件并根据 frontmatter 变量移动它的脚本

Obsidian 中的 Bash 脚本:用于重命名文件并根据 frontmatter 变量移动它的脚本

我正在使用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

有任何想法吗?

相关内容