こんにちは、lisです!
NotionからObsidianにお引越しすべく、Notionのノートをエクスポートしました。
これを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
そこでfind
とwhile
の組み合わせで、ファイル名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したり、パス名短くしてやり直したり……と試行錯誤していたらでなくなった気がします。
今となっては、まぁ改行コード統一できたからいっか。と思っています。