ブログの中でスクショを乗せることがあるんですが、Ubuntuの標準アプリで撮ったスクリーンショットのファイル名が、デフォルトだと空白文字を含んだ状態で保存されてしまいます。

空白文字いらない

これをブログに載せようと思ったら、空白文字をいちいちURLエンコードしないといけないことに気づいてしまいました。

めんどくさすぎる

そこで、あれこれやって空白文字をアンダースコアに置き換えて保存する方法を見つけたので共有します。

どうやったか

まず標準アプリでフォーマットを指定できるか調べてみましたが、これはどうやらできないみたいです。 (設定項目に名前のフォーマットを指定するプロパティがありませんでした。)

dconfエディターで確認した様子

そこで、しょうがないのでスクリーンショットが保存されるディレクトリを監視して、ファイルが作成されたらファイル名を空白文字からアンダースコアに書き換えるshを実装しました。

(ちなみに、shの実装は全部ChatGPTにおまかせしちゃいました。)

監視のためのサービスはsystemdに登録し、再起動してもちゃんと動いてくれるようにしました。

実装手順

まずはディレクトリ監視に必要なライブラリをインストールしておきます。

sudo apt install inotify-tools

インストールできたら、スクリーンショットの保存先ディレクトリを監視してファイル名を置き換えるshを実装します。 以下が作成したshファイルです。

#!/bin/bash

### BEGIN INIT INFO
# Provides:          screenshot_monitor
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Screenshot Monitor
# Description:       Monitors directory for new screenshots and performs actions
### END INIT INFO

# スクリーンショットの保存先ディレクトリ
screenshot_dir="/home/[username]/Pictures/スクリーンショット"

# 監視対象のイベントを指定してinotifywaitを実行し、新しいファイルが追加された場合にスクリプトを実行する
inotifywait -m -e create -e moved_to "$screenshot_dir" |
    while read -r directory event filename; do
        # スペースをアンダースコアに置換
        new_filename=${filename// /_}
        new_filepath="$screenshot_dir/$new_filename"
        
        # ファイル名の変更
        mv "$directory$filename" "$new_filepath"
    done

[username]の部分は自身のユーザー名に置き換えてください)

このshを/etc/init.d/に置いて、実行権限を付与しておきます。

chmod +x ./screenshot_monitor.sh
sudo mv ./screenshot_monitor.sh /etc/init.d/

続けて、systemdにサービスを登録します。

新たに/etc/systemd/system/screenshot-monitor.serviceというファイルを作成し、必要な項目を記入していきます。

sudo nano /etc/systemd/system/screenshot-monitor.service

実装したのは以下のような内容です。

[Unit]
Description=Screenshot Monitor
After=network.target

[Service]
ExecStart=/etc/init.d/screenshot_monitor.sh

[Install]
WantedBy=default.target

このファイルを保存したら、systemdをリロードし、サービスの有効化とサービスの開始を行います。

sudo systemctl daemon-reload
sudo systemctl enable screenshot-monitor.service
sudo systemctl start screenshot-monitor.service

これで完了です。

動作確認

早速保存してみたところ、ちゃんとファイルが保存されていることが確認できました。

やったね!

まとめ

今回はsystemdを使用した方法を紹介しました。

ただあまりLinuxについて詳しくないので、もっといい方法があったらぜひ教えていただきたいです!!

あとChatGPTすごすぎ。