Macで右クリックを使用して新規テキストファイルを作成する


背景と目的

WindowsからMacに乗り換えて「Mac良いぞ!」と思う今日この頃。しかしながらWindowsでやっていたあの操作をMacでもやりたいと思うこともなくはない。そう、右クリックで新規テキストファイルを作成したいのだ。

調査が足りないのかもしれないが、Macの標準機能に欲しい機能がなかったのでAutomatorを使用して作成する。

使用したもの

  • macOS Catalina バージョン 10.15.6
  • Automator
  • Bash

機能作成

元となるシェルスクリプトを作成する

まずはシェルスクリプトでカレントディレクトリに「newTextFile_N.txt」(Nは整数)と言う名前のテキストファイルを作成できるようにしよう。ここでカレントディレクトリにファイル「newTextFile_N.txt」が存在するときはファイル「newTextFile_N+1.txt」を作成することにし、Nの上限として100を指定した。下記「createNewFile.sh」を実行するとカレントディレクトリに「newTextFile_1.txt」などのファイルが生成される。なおwhileループの行に書かれているコロンはヌルコマンドである。

createNewFile.sh
#!/bin/bash

# ファイル名の基本部分と拡張子
file_name_stem="newTextFile_"
file_extension=".txt"

# 新規テキストファイルの上限の指定
max_num=100

# 初期値を設定して無限ループを開始
i=1
while :; do
  # テキストファイルのファイル名の指定
  file_name="${file_name_stem}${i}${file_extension}"
  # 上記ファイル名が存在しない場合、空ファイルを作成し終了
  if [ ! -e "${file_name}" ]; then
    touch ${file_name}
    exit 0
  fi
  # 上記ファイル名が存在する場合、iをインクリメント
  i=$((i+1))
  # iが上限を超えたらエラーを表示して終了
  if [ ${i} -gt ${max_num} ]; then
    echo "Error: The new text files are too many." 1>&2
    exit 1
  fi
done

Automatorで新規クイックアクションを作成する

Finderでディレクトリを右クリックして選択できるサービスのメニューの中に新しくテキストファイルを追加するメニューを作成しよう。以下の手順で作成することができる。手順番号と図中の丸で囲まれた番号は対応しているので適宜図を参照してほしい。
1. Automatorを開いて新規作成でクイックアクションを選択する。
2. 左カラムの検索窓からアクション「シェルスクリプトを実行」を検索する。
3. 左カラムにあるアクション「シェルスクリプトを実行」を右カラムにドラッグする。
4. 右カラム上部にある「ワークフローが受け取る現在の項目」欄を「フォルダ」にする。
5. 右カラム上部にある「検索対象」を「Finder.app」にする。
6. 右カラムの「シェルスクリプト実行」欄にある「シェル」を「/bin/bash」にする。
7. 右カラムの「シェルスクリプト実行」欄にある「入力の引き渡し方法」を「引数として」にする。
8. 右カラムの「シェルスクリプト実行」欄内のスクリプト記述欄を右クリックして自動変換の全てのオプションのチェックを外す。
9. 右カラムの「シェルスクリプト実行」欄内のスクリプト記述欄にスクリプトを記述する(次節参照)。
10. 適当な名称で保存する(例えば「create a new text file」)。

この後Finderで適当なフォルダを右クリックしてサービス欄を見ると先程保存した名称があるはずだ。これをクリックすれば選択したフォルダに新規テキストファイル「newTextFile_1.txt」が作成される。もし「newTextFile_1.txt」が既に存在すれば「newTextFile_2.txt」が作成される。

Automatorに記述するスクリプトについて

Automatorには先述したシェルスクリプトを少し改変した以下のものを記述する。具体的にはまず$1で選択したディレクトリのパスを取得する。それに伴いファイル名の先頭にディレクトリのパスを追加。また作成ファイル数が上限を超えた場合に通知する場所を標準エラー出力からFinderのポップアップに変更。

#!/bin/bash

file_name_stem="newTextFile_"
file_extension=".txt"
# 選択したディレクトリのパスを取得
selected_directory="${1}"

max_num=100

i=1
while :; do
  # ファイル名の先頭に選択したディレクトリのパスを追加
  file_name="${selected_directory}/${file_name_stem}${i}${file_extension}"
  if [ ! -e "${file_name}" ]; then
    touch ${file_name}
    exit 0
  fi
  i=$((i+1))
  if [ ${i} -gt ${max_num} ]; then
    # ファイル数の上限を超えた場合はポップアップで通知
    osascript -e 'tell app "Finder" to display dialog "Error: The new text files are too many."'
    exit 1
  fi
done

参考

自動変換のオフについてはこのページを見た。

理解不足な点

Finderで選択したディレクトリのパスを取得する方法として$1を利用する方法はこのページを見て思いついた。意図通りの動作をしているが理解しているわけではない。この辺の仕様がわかる人がいれば是非教えて欲しい。