Skitchの画面キャプチャを自動でリネームするDocker環境の構築

# はじめに

- **きっかけ**
    - 画面キャプチャに`Skitch`を使っている
        - 矢印を付けたり、注釈を追加できるので気に入っている
        - しかし、ファイル名にタイムスタンプが付かないため、保存時にファイル名を手動で調整する必要があり、少し手間に感じていました
- **目的**
    - 自動でファイル名にタイムスタンプをつけて重複しないようにしたい
    - `incron`というツールを知ったので、これを使ってみたい

# Skitchとは

- [【macOS・iOS】高機能な画面スクリーンキャプチャツールSkitchを使いこなそう](https://notepm.jp/blog/10524)
    
    > 社内で情報共有したり、ブログを書いたりする際に、スクリーンショットを撮影することがよくあります。そんな時には、撮影した画像に何か説明を書き込みたいと思うこともよくあるでしょう。
    > 
    
    > Skitchの魅力はなんといっても、キャプチャした後の編集にあります。キャプチャすると、撮影した内容がSkitch上に表示されます。これが編集画面です。
    > 
    > ![](https://wp.notepm.jp/wp-content/uploads/2021/10/usage-skitch-19.png)
    

# incrnとは
- [incronを使ってみた](https://qiita.com/k-suzuki/items/4a94ebeda9ec75fdad40)

    > • ファイルの作成、変更、削除、移動といったイベントを検知して、登録したジョブを実行させるものです。
    > 
- [Incron - ArchWiki](https://wiki.archlinux.jp/index.php/Incron)

    > 
    > 
    > 
    > 監視ディレクトリにファイルが作成されたときにコマンドを実行するには:
    > 
    > IN_CREATE
    > 

# 作るものの概要

- Dockerでincronを動かす
- 画像の保存先はバインドマウントする
- ディレクトリを監視してファイルの作成をトリガーに動作させる
- Skitchの保存先としてそのディレクトリを指定する
- ファイル名にタイムスタンプを追記して、処理後に別のディレクトリに移動させる
    - 処理前：Cursor_と_Qiita.png
    - 処理後：Cursor_と_Qiita_20241026_105157.png

# 完成したもの

- ディレクトリ構成
    ```bash
    $ tree
    .
    ├── Dockerfile
    ├── README.md
    ├── docker-compose.yml
    └── work
        ├── img
        ├── img_re
        ├── log
        └── rename.sh
    ```
    
- `work/img`: 監視対象のディレクトリ、Skitchからここに画像を保存してください
- `work/img_re`: タイムスタンプが追記され、ここに移動されます
- `work/rename.sh`: リネームと移動を行うシェルスクリプト

# ソースの説明

- Dockerfile
    
    ```Dockerfile
    FROM ubuntu:16.04
    
    # パッケージの更新とincronのインストール
    RUN set -x && \
        apt-get update && \
        apt-get upgrade -y && \
        apt-get install -y incron
    
    # incronの設定
    # rootでの実行を許可する設定する
    RUN echo 'root' > /etc/incron.allow
    # 監視ディレクトリ イベント 処理内容 引数 を設定する
    RUN echo '/usr/share/work/img/ IN_CREATE /usr/share/work/rename.sh $#' > /var/spool/incron/root
    
    # incronをフォアグラウンドで起動
    CMD ["incrond", "-n"]
    
    ```
    
- docker-compose.yml
    
    ```docker-compose.yml
    version: "3.7"
    
    services:
    
      ubuntu_incron:
        container_name: oguro_incron
        build:
          context: .
        volumes:
          - ./work:/usr/share/work
        restart: always
        tty: true
    
    ```
    
- work/rename.sh
    
    ```work/rename.sh
    #!/bin/bash
    
    # ログに元のファイル名を記録
    echo "$1" >> /usr/share/work/log
    
    # 日付の取得（日本時間でフォーマット）
    d=$(TZ=JST-9 date "+%Y%m%d_%H%M%S")
    
    # スペースをアンダースコアに変える
    file_name=$(echo "$1" | sed "s/ /_/g")
    mv "/usr/share/work/img/$1" "/usr/share/work/img/$file_name"
    
    echo "元ファイル名: $1"
    echo "新ファイル名: $file_name"
    
    # 拡張子が.pngの場合のみリネームして移動
    if [[ $file_name =~ \.png$ ]]; then
      new_file_name=$(echo "$file_name" | sed -E "s/(.*)\.png$/\1_$d.png/")
      mv "/usr/share/work/img/$file_name" "/usr/share/work/img_re/$new_file_name"
      echo "移動先ファイル名: $new_file_name"
    fi
    
    ```
    

# 使用方法

1. Dockerイメージをビルドします

    ```bash
    docker-compose build
    ```
    
2. コンテナを起動します
    
    ```bash
    docker-compose up -d
    ```
    
3. `work/img`ディレクトリに`.png`ファイルを追加すると、自動的に処理されます

## 実行権限の付与

- `rename.sh`に実行権限を付与する必要があります。以下のコマンドを実行してください

    ```bash
    chmod +x work/rename.sh
    ```

# さいごに

- Skitchで効率よくファイルを保存することができるようになりました
- incronの活用は、今後他のプロジェクトでも役立てられると感じています