本日2件のお問い合わせがありました。

✉️FIELDにお問い合わせ

システム開発

ドラッグしただけでファイルリストの文字を取得する(automator + シェルスクリプト + AppleScript)

こんにちは山本です。

最近、行政プロジェクト中に
zipを開いたらけっこう数のファイルがあり、
「差し替えるだけだよーん」という依頼を受けました。

今やcopilotなどで、行を選択して
ファイル名これですよといって修正してしまえば1分でできる時代ではあるものの、

「この大量なファイルを文字列で取得するのがだるい」

という2年前では考えられないような贅沢な課題が生まれています。

なんかこう、ドラッグするだけで全部ファイル名リストにしてコピーできるようなものできないかな。

と思ったことがある人もいるでしょう。
もちろん、ターミナルなどで、その場所まで行ってlsと実行すれば終わりなのでしょうが、
それすらめんどうという贅沢な時代です

そこで、
そんな業務の全てをオートメーションにしているあなたのために、
超簡単にファイルリストを取得するやり方を書きます。

設定時間、実に3分です。

1. Automatorを起動する

まず、
command + spaceでファイルを検索し
automatorというアプリケーションを開きます。
以上です。
ここまでは5秒ですね。

2.クイックアクションを選択する

Automatorはその名の通り、いろいろな作業を自動化してくれますよというアプリです。
よくある流れやアプリケーションは「テンプレート」として用意してくれてるので
テンプレートから「クイックアクション」 を選択して「選択」をクリックします。

ここまでは10秒ですね。

3. 設定を行う

ワークフローが受け取る現在の項目を

  • 「ファイルまたはフォルダ」 に変更。
  • アプリケーションは 「Finder」 のままにします。

アクションを追加する

左側のアクションリストから、以下の2つを順番にドラッグして右側のエリアに追加します。

  1. 「シェルスクリプトを実行」
    • シェルを/bin/zshまたは/bin/bashに設定。
    • 入力の引き渡し方法を「引数として」に設定します。

シェルスクリプトには、以下を記入してください:

for f in "$@"
do
    basename "$f"
done

osascript -e 'display notification "ファイル名のコピーが完了しました。" with title "コピー完了"'

まぁこういうことですね。
コードは上にある通りのものをコピーすればいいので
5箇所くらいクリックしてペースとするだけなので15秒くらいでできるはずです。

貼り付けたコード時代の解説はみなさん興味がないかもしれませんが、
一応解説をすると、

クリックアクションを選んだ時点で、ドラッグをしたときに引数で入ってくる情報は
選択されたファイルたちのパス情報になります。
それらがオブジェクトとして入っているのが$@ となり、
for文で一つ一つ回しますが、$fはパスではなくてその中のファイル名です。
そして
osascript -e ‘display notification “ファイル名のコピーが完了しました。” with title “コピー完了”‘
コピー完了しましたよと表示してます。

ここまでで、本当にクリップボードにコピーしてるわけではないのです。
ではこの情報をどうやってコピーするのか。

4. 次に「クリップボードにコピーを追加します。

シェルスクリプトを実行のようなアクションが並んでいるところに
クリップボードをコピーというものがあるので
それをダブルクリックします。

このAutomatorスクリプトがクリップボードにコピーされる理由は、このシェルスクリプト自体ではなく、その後に続けて設定している以下のAutomator標準アクションがあるからです。

Automatorがそのスクリプトの標準出力の結果を自動的に次の「クリップボードにコピー」アクションへ渡しているのです!!

automatorとはそれぞれの返り値を次のアクションに渡すGUIの関数のようなものだと考えるとめちゃくちゃわかりやすいのではないかと思います。

ここまで30秒くらいでできますよね。

では、

もうコピーできてるのですが、
いつもこのコピーしたものをメモ帳を開いて貼り付けるようなアクションもせっかくなので追加してみましょう。

on run {input, parameters}
	
	set copiedText to ""
	repeat with i in input
		set copiedText to copiedText & (i as text) & return
	end repeat
	
	tell application "TextEdit"
		activate
		set newDoc to make new document
		set text of newDoc to copiedText
	end tell
	
	display notification "ファイル名のコピーが完了しました。" with title "コピー完了"
	
	return input
end run


on runはAutomatorのスクリプトが動く時に初めに実行される部分で、
引数のinputはFinderで詮索したファイルのフルパスがまた入っています。
iの部分がぐるぐる回ってますよね。

▶︎ tell application "TextEdit"

  • macOSの標準アプリケーション「テキストエディット」を呼び出します。

▶︎ activate

  • テキストエディットを最前面に表示します。
  • このコマンドでテキストエディットが立ち上がります。

▶︎ set newDoc to make new document

  • テキストエディットに新しいドキュメントを作ります。
  • このドキュメントの参照を変数newDocに保存しています。

▶︎ set text of newDoc to copiedText

  • 新しく作成したドキュメントの中に、先ほど加工したcopiedTextの内容を貼り付けます。
  • これにより新規ドキュメント内に、選択したファイルのパスが表示されます。

AppleScriptは最後に処理した結果をAutomatorに返します。

今回の場合、返した内容をさらに次のAutomatorのアクションで使いたいときのために、念のためinputをそのまま返しています。

今回のスクリプトだけで完結するなら、この返り値は特に何も影響しません。

こんな感じでできます。

便利ですね。

Yamamoto Yuya

プロフェッショナルとしての高いスキルと知識を持ち、誠実さと責任感を大切にする。常に向上心を持ち、新たな挑戦にも積極的に取り組む努力家。