写真ファイル一括操作コマンド "cyfs" をアップデートしました

f:id:syonx:20210905164652p:plain
cyfs-cli

cyfsとは

写真ファイルなどを一括でリネームしたり、更新日時・撮影日時をもとにフォルダ振り分けを行うコマンドです。 npm で公開していて、WindowsMacどちらからも利用できます。開発の経緯はこちら。

syonx.hatenablog.com

インストール

※ Node.js のインストールが前提です。

$ npm install -g cyfs-cli

具体的な使い方の例

step1.yml ・・・ 写真.app に取り込んだデータのうち写真のみを指定のフォルダにコピーします。

select:
  pattern: "Photos Library.photoslibrary/Masters/2021/**/*.jpg"
  options:
    cwd: "/Users/syon/Pictures"
action:
  do: "fetch"
  args:
    baseDir: "Photos Library.photoslibrary/Masters/2021"
    destDir: "2021-photos"

step2.yml ・・・ コピーした写真ファイルを撮影日時の年/月/日フォルダに振り分けて移動します。

select:
  pattern: "2021-photos/**/*.jpg"
  options:
    cwd: "/Users/syon/Pictures"
action:
  do: "chronicle"
  args:
    preferExif: true
    baseDir: "2021-photos"
    destDir: "photos"
    destFormat: "YYYY/MM/DD"
$ cyfs step1.yml

$ cyfs step2.yml
2021-movies/2021/02/01/IMG_0022.jpg
2021-movies/2021/03/01/IMG_0103.jpg
2021-movies/2021/04/01/IMG_0144.jpg
2021-movies/2021/05/01/IMG_0205.jpg
2021-movies/2021/06/01/IMG_0360.jpg

3年間使ってみての感想

結論、ものすごく活躍してくれました。

iPhoneの写真をPCに取り込んで整理する、というのがメインの用途でした。 2021年5月末に有料化したGoogleフォトの退避に伴う写真整理のイベントもありましたね。

写真の撮影日時以外にも、ファイル名やファイルサイズといった情報を使った操作ができます。 スクレイピングして集めたファイルで稀にファイルサイズが 0 となってしまう場合を検出したり、.DS_Storeなどのゴミファイルを削除したり、空のフォルダを除去したり。 とあるディスクの容量が逼迫しているから、ファイルサイズ1GB以上のものをリストアップして1つ1つ要否を判断、という使い方もありました。

やはり、あらかじめ用意したレシピファイルを使って定形処理を行うコンセプトが正解でした。 自動化による速さと確実さのおかげで、億劫な写真整理のハードルが低くなり、iCloudの容量を抑えて利用できています。 本当はこんなことせずともうまいこと管理されるとよいのですが。。

アップデートの背景

利用すると warning が出るようになってしまいました。詳しくは追っていませんが、まあ古いですからね。 3年前の2018年5月頃は Node.js v8 で、今のLTSが v14 なので、随分と昔のことのように感じます。 これからも使い続けるつもりなのでアップデートを決めました。

ES Modules との戦い

cyfs ではゴミファイルの検出に sindresorhus/junk を使っています。 パッケージを最新化してみたところ、エラーに遭遇し、こちらの記事にたどり着きました。

これからは ESM の時代かー、よーし対応しちゃうぞー、と頑張ってみましたが業界的にもまだまだ過渡期なようでして。 テストフレームワークの jest でも完全対応していないし、CLI作成フレームワーク oclif もまさに対応中といったところでした。 ここは一旦諦めて、CommonJS (CJS) で我慢して Node.js v14+ を前提にしたアップデートに留めた、というお話でした。

おわりに

3年も放置したらアカン😇

3ヶ月に1度くらいメンテしたい。またそれが億劫にならないように、テストコードをきちんと用意したり開発の流れがわかるようにしておきたい。 そうそう、今回は Volta を試しました。 package.json にちゃんと Node.js のバージョン書いておきましたから。