すでにnotmuchdbにあるmaildirメッセージファイル名からnotmuchmessage-idとthread-idを取得するにはどうすればよいですか?
ファイルを返すクエリをあまり行わないと仮定しましょう。
$ notmuch search --output=files tag:inbox from:love
これにより、Maildirメッセージを指すファイルのリストが返されます。今、私はこれらのファイルの1つを選びます(すでに多くのデータベースにありません)、例えば
FILENAME=$(notmuch search --output=files tag:inbox from:love | fzf)
そして、私はそのメッセージIDとスレッドIDをnotmuchデータベースで取得したいと思います。変数$ FILENAMEから、メッセージIDをそれほど多く見つけたいと思います。
これを行うための非常にずさんな方法は、ファイルを解析し、ヘッダーを/ subject / dateから読み取り、それほど多くのクエリを作成しないことnotmuch search from:{...} subject:{...} date:{..}
です。しかし、ファイル名はすでにデータベースに保存されているので、ファイル名からメッセージIDを取得するための標準的で堅牢な方法があるはずです。
ありがとう!
回答
NOTMUCH-SEARCH-TERMS(7)でmaildirファイル名に基づいてnotmuchデータベースを検索する方法が見つかりませんでした
メッセージIDを繰り返すことで、検索から直接メッセージIDとそれほど多くのスレッドIDを取得できません。
for message_id in $(notmuch search --output=messages 'tag:inbox from:love') do thread_id=$(notmuch search --output=threads $message_id) echo "$thread_id - $message_id"
done
または、スレッドを繰り返し処理して、関連付けられたメッセージIDを取得することもできます。
for thread_id in $(notmuch search --output=threads 'tag:inbox from:love')
do
# sed is here only to provide the output in the same format as in the first example
notmuch search --output=messages $thread_id | sed "s/^/$thread_id - /"
done
あなたのニーズにより良く合うものは何でも。両方のforループの出力は、次の形式になります。
thread:THREAD_ID - id:MESSAGE_ID
…
From、Date、Subjectヘッダーを取得したい場合は、formail(1)または同様のツールを使用してmaildirファイルを解析することなく、jqを使用してnotmuchデータベースから直接抽出することもできます。
notmuch search --format=json id:MESSAGE_ID | jq -r '.[].subject'
私は最終的に、それほど多くないpythonバインディングを介して方法を見つけました。を参照してください。 https://notmuch.readthedocs.io/projects/notmuch-python/en/latest/database.html?highlight=filename#notmuch.Database.find_message_by_filename
ワーキングバッシュワンライナーは
threadId=$(python3 -c "import notmuch; db = notmuch.Database(); print(db.find_message_by_filename('$FILENAME').get_thread_id())");
解凍されたpython3コードは
import notmuch
db = notmuch.Database()
msg = db.find_message_by_filename('filename of the maildir message')
msg.get_thread_id()