lisz-works

プログラミングと興味を貴方に

NotionからObsidianしたら改行コード違ったので解決方法

【スポンサーリンク】

Linuxペンギン

こんにちは、lisです!

NotionからObsidianにお引越しすべく、Notionのノートをエクスポートしました。

www.lisz-works.com

これをObsidianに全てぶちこんでみたところ、NotionとObsidianでは改行コードが異なることがわかりました。

ということで、今回は全てのエクスポートしたノートの改行コードをLinuxのコマンドで置換します。

現在の改行コードを確認

cat -eすると、行末に改行コードを付けた状態でファイルの内容を出力してくれます。

cat -e {target-file-path}
表示 改行コード
^M CR
$ LF

Notionでは、CRLF(^M$)のようですが、ObsidianはLF($)でした。

なのでCRを削除したいですね。

サブディレクトリを含む全ファイルパスを取得

サブディレクトリ内も含め、全てのファイルパスを取得する方法。

find -type f

findはパス指定必須なのかと思ってましたが、何もしないとカレントディレクトリをサーチしてくれるようです。

念のためmarkdownファイル(*.md)のみに絞る。

find -type f -name *.md

改行コードの削除

tr -dを使用することで、対象文字列を削除した結果を出力できるようです。

echo "abcdef" | tr -d "cd"
abef

これを使って改行コード:CR(^M)を削除します。

cat -e hoge
ab^M$
cd^M$
ef^M$
❯ cat hoge | tr -d '\r' >! hoge
❯ cat -e hoge
ab$
cd$
ef$

空白を含むファイル名を全て処理する

ファイル名に空白を含んでいるので、それを含め全て処理したかった。

Notionからエクスポートしたファイルもフォルダも、「名前 IDみたいの」という感じなので必ず空白が入っています。

タイトルに空白が入っていたら、そのままファイル名/フォルダ名になるので、更に空白が入ります。

空白がなければ↓のようにできるけど

❯ l
fuga
hoge
❯ for f in `ls`; do echo $f; done
fuga
hoge

空白があると↓のように、スペースで分割されてバラバラになってしまう。

ls -1
hoge
't e s t.md'
test.md
❯ for f in `ls`; do echo $f; done
hoge
t
e
s
t.md
test.md

そこでfindwhileの組み合わせで、ファイル名1行を変数として持って一括処理できることを知った。ステキ。

find -type f | while read f; do ls "${f}"; done
./hoge
'./t e s t.md'
./test.md

最終成果

ということで最終的にこんなコマンドを実行しました。

find -name '*.md' -type f | while read file; do cat "${file}" | tr -d '\r' >! "${file}"; done

>!は、zshでリダイレクトを使ってリダイレクトしようとすると怒られるの対策です。

bashとかの場合>でリダイレクトすればOKです。

参考

コチラを参考にしました。ありがとうございました!

takuya-1st.hatenablog.jp www.koikikukan.com linux.just4fun.biz qiita.com

あとがき

適当にNotionからエクスポートしたフォルダごと、Obsidianに入れたらObsidian Gitがなんかポップアップ出るので対処した……つもりでした。

しかし実態は、git addで失敗してコミットできない!って怒っていたようでした。

手動でgit addしたり、パス名短くしてやり直したり……と試行錯誤していたらでなくなった気がします。

今となっては、まぁ改行コード統一できたからいっか。と思っています。