Scrapboxに現在のディレクトリ内の全ファイルを保存するためのPythonのスクリプト
#Scrapbox #Python
やりたいこと
Gitで管理するまでもない試行錯誤中やうまく行かなかったら例などのコードをScrapboxに貯めておきたいときに使う。
一つずつ手動でコピーするのは手間だしファイルパスなども打ち間違えたりする要素を排除して次やりたくなったときも再現的に実行したい。
例えば、以下のように適当に開発をしていて、Gitで管理するほどでもないけどやったことをどこかに記録したくなったとする。
code:階層
.
├── README.md
├── index.html
└── js
└── script.js
このファイルたちを以下のようにScrapboxに記録しておきたい。
code:README.md
# ...
...
code:index.js
...
code:js/script.js
...
これを叶えるために、コマンド叩けば上記のScrapboxのコードを生成するスクリプトを作った。
使い方
以下のScrapboxのコードを生成するスクリプトを保存して、python gen.pyとすると標準出力にScrapboxのコードが生成される。
code:gen.py
import pathlib
import sys
# Scrapbox output
out = sys.stdout
# Get all paths
paths = pathlib.Path(".").rglob("*")
for p in paths:
path = str(p)
if p.is_dir() or path.startswith(".git") or path.startswith(".idea"):
continue
with open(path, 'r') as f:
print('code:%s' % path)
for line in f:
print('\t'+line, end='', file=out)
print('', file=out)
(pathlibのやつは「Pythonでディレクトリ直下の全ファイル/ディレクトリを一覧したい(子も孫もひ孫も...)」)
一時ファイルを作らずもっと手軽にやるなら、
Macユーザーなら、上記のPythonスクリプトをコピーした後に、
以下のコマンドを叩くとクリップボードにScrapboxのコードがコピーされる。
code:bash
pbpaste | python3 | pbcopy
上記コマンドでやっていることはクリップボードあるgen.pyをpython3コマンドにパイプで流して実行してその結果をpbcopyコマンドを使ってクリップボードに保存している。
注意点は上記はクリップボードを変更させるため2回続けて実行はできないこと。再度やりたくなったら再度gen.pyをコピーしてから実行すべき。
TipsとしてScrapboxは以下のコピーできるぽいアイコンをクリックするとコピーできる。
https://gyazo.com/29ec4c72676c1c2efdaefa7df3625a92
デモ
pbpaste | python3 | pbcopyを使った方法のやり方例。
https://gyazo.com/65f764eb4dbfc7d8cc6c12af30b79166
おまけ
.gitと.ideaは除外しているVS Code系とか.gitignoreするようなものは除外すべきだと思うが人によって好みがあると思うで、定義変更して自分好みのgen.pyを自分のScrapboxに記録する運用で良いと思う。
Pythonで書いた理由はシェルを除く他のスクリプト言語に比べて最初からインストールされていることが多いから。
GitHubで管理するほどでもないというより、GitHubだとリポジトリの名前つけるコストなどがあってコード管理するならScrapboxより向いているのはわかるが、手軽に記録を残したいときにこれは使う。あとからGitHubに上げることもできるし。
バイナリかどうか検知をしてスキップするようにもしたい気がする。技術的には「JavaScript: fileコマンドと同じ方法でバイナリかテキストか判定する」にシンプルな実装があるのでこれを参考にできそう。
これの逆変換も欲しくなりそう。つまりScrapboxのコードブロックをファイルとして保存するやつ。