以下のスクリプトを実行すると Chrome のブックマークを "path","name","url"
形式の CSV として出力できます。フォルダがネストしている場合は "path"
に folder1 > folder2 > ... > folderN
形式の値が入ります。
chrome-bookmarks.sh
# Chrome のブックマークが保存されているファイルのパス.
# 以下は Mac の場合のパスなので環境に合わせて変更してください.
declare -r bookmarks_file_path="${HOME}/Library/Application Support/Google/Chrome/Default/Bookmarks"
jq -r '
.roots.bookmark_bar.children[]
| {path: [], node: .}
| recurse(.
| select(.node.type == "folder")
| {path: [.path[], .node.name], node: .node.children[]})
| select(.node.type == "url")
| [(.path | join(" > ")), .node.name, .node.url]
| @csv
' "${bookmarks_file_path}"
ポイントは以下の部分です。
...
| {path: [], node: .}
| recurse(.
| select(.node.type == "folder")
| {path: [.path[], .node.name], node: .node.children[]})
...
recurse は再帰的に探索するための関数です。これを用いると、ツリー構造の中から特定の構造にマッチする部分を処理することができます。
recurse を用いてブックマークにおけるフォルダツリーを再帰的に探索し、path: []
にネストしたフォルダの名前を集めます。結果として {path: ["folder 1", "folder 2", ..., "folder N"], node: ...}
形式のオブジェクトが生成されます。
次に、最終結果からフォルダを除外するために select(.node.type == "url")
で絞り込んでいます。
| select(.node.type == "url")
以下の部分では CSV の行データとなる配列を生成しています。CSV に含めるカラムを変更したい場合は、ここを修正します。
| [(.path | join(" > ")), .node.name, .node.url]
最後に以下の部分で CSV データに変換しています。
| @csv