[ Mac ] サービスを利用してファイルのパスをコピー・文字列置換する

# 技術ブログを書いてる時、ファイルパスを書くこと多くありません？
今回の記事は下記動画のように任意のファイルの置き場所（ファイルパス）を簡単に取得し、かつユーザー名のところを"[ユーザー名]"に置き換えてクリップボードにコピーするという方法についてです。

![usage.gif](https://qiita-image-store.s3.amazonaws.com/0/102012/71642cff-3091-058e-d849-8096878a5bb4.gif)

※ 本記事はOS X10.9.5で書いてます。最新のOSバージョンでは異なる表記もあるかもしれませんが、大体似たような感じかと思います

## 背景
例えば「VSCodeの設定は下記にあります」みたいな状態です。

```
/Users/[ユーザー名]/Library/Application Support/Code/User/settings.json
```
もしくは

```
~/Library/Application Support/Code/User/settings.json
```

このファイルパスを記事に書くとき、みなさんどうしてますでしょうか。

## 直球な方法
例としてデスクトップにあるmjg_sel_solo.pyのファイルパスを書いてみます。

<img width="392" alt="info.png" src="https://qiita-image-store.s3.amazonaws.com/0/102012/d72bb729-6e9a-b813-c6f0-0806764c7796.png">

1. ファイルを選択する
2. cmd+iで情報ウィンドウを開く
3. 場所の部分をドラッグする
4. cmd+Cでコピー
5. テキストエディタに貼り付けをする
6. ```/Users/xxxxxx/Desktop```の```xxxxxx```の部分を```[ユーザー名]```に書き換える(xxxxxxには実際のユーザー名が入っている)
7. 最後に```/mjg_sel_solo.py```を書き加える

**めんどくさい事この上ない**

## 今回ご紹介する方法

1. ファイルを選択する
2. 右クリックメニューからcopy_pathを実行(後述しますが、ショートカットでも実行可能です)
3. 実際のユーザー名を[ユーザー名]に置き換え済みのファイルパスがすでにクリップボードにはいっているので、貼り付けするだけ

**かんたん！**

## サービスの作成方法
### Automatorの起動
Spotlightで「Auto」と入力し、Automatorを起動。新規書類ボタンを押す。
![run_automator.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/53578d31-0f7f-d0ce-c8b1-ca07ae3df544.jpeg)

### 新規サービスの作成
サービスをクリックし、選択ボタンを押す。
![new_service.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/07b397a6-45d5-c44d-680d-179ce51f65a1.jpeg)

### アクションの追加「クリップボードにコピー」
アクション検索窓に「クリップ」と入力し、「クリップボードにコピー」をワークフローパネルにドラッグ・アンド・ドロップする。
![clip01.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/8e6d2ede-d7b6-6335-5fc1-91955f67d357.jpeg)

### サービスの保存
名前をつけて保存しておく。保存はcmd+Sで。
![save.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/b2f2b79d-9112-2332-7a5f-4c998b3e6b99.jpeg)

### 「クリップボードにコピー」の設定
クリップボードにコピーする対象をファイルにするため、設定を変更する。
- "サービス"は、次の項目を受け取る:```ファイルまたはフォルダ```
- 検索対象:```Finder```

![clip_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/247ae7d8-bb23-3816-b5d2-89bec7f8dba4.jpeg)

ここまでの作業でファイルのパスをコピーするだけのサービス（ユーザー名の置換なし）は作成完了です。

### アクションの追加「シェルスクリプトを実行」
アクション検索窓に「シェル」と入力し、「シェルスクリプトを実行」をワークフローパネルにドラッグ・アンド・ドロップする。
![shell.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/14cca51f-611d-a740-86d8-c6affdd6dbb0.jpeg)

### 「シェルスクリプトを実行」の設定
- シェル:```/bin/bash```
- 入力の引き渡し方法:```引数として```
- スクリプトは下記の通り(xxxxxxは自分のユーザー名を入れてください)

```copy_path.workflow
for f in "$@"
do
	echo $f | sed -e "s/xxxxxx/[ユーザー名]/g"
done
```
![shell_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/dbbb0fad-aa3b-255b-807b-fcb0f5f0d54c.jpeg)

このアクションで文字列の置き換えを実行しています。

※ [こちら](#シェルスクリプトを実行の設定2)にホームディレクトリからのパスへ置換する方法を追記しました。

### アクションの追加「クリップボードにコピー」
アクション検索窓に「クリップ」と入力し、「クリップボードにコピー」をワークフローパネルにドラッグ・アンド・ドロップする。(シェルスクリプトで置換した文字列を、再度クリップボードに保持する)
![clip02.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/f0d98184-5a2d-78ca-6ea7-d4609ba80613.jpeg)

**これでサービスの作成は完了です！**

## ショートカットの設定方法
せっかく作った機能なので、右クリックメニューからだけではなくショートカットで実行できるようにしておきましょう。

### キーボードウィンドウの表示
1. システム環境設定を起動する
2. キーボードをクリック
3. ショートカットタブをクリック
4. サービスをクリック
5. ファイルとフォルダ内にcopy_pathがあるので「ショートカット追加ボタン」を押す

![key_setting01.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/d8e11834-8280-6475-10e1-5880512f8a90.jpeg)

### 任意のショートカットを押して設定
ここではcmd+option+Cにしておきました。

![key_setting02.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/00eaf6ca-6b9d-cc1c-2a40-226cc9a99676.jpeg)

### 使う
任意のファイルを選択してcmd+option+Cを押すだけで、文字列置換後のファイルパスがコピーできました！

地味に便利かと思うのでご興味がある方は使ってみてはいかがでしょう。

### 追記-ホームディレクトリからのパスとしてコピー
クリップボードにコピーされる文字列ですが、ホームディレクトリからのパスとしてコピーした方が良いんじゃない？というご意見を頂いたので、そのやり方も追記しておきます。

(例) デスクトップのmjg_sel_solo.pyファイル

```
~/Desktop/mjg_sel_solo.py
```
#### 「シェルスクリプトを実行」の設定2
スクリプトは下記の通り(xxxxxxは自分のユーザー名を入れてください)

```copy_path.workflow
for f in "$@"
do
	echo $f | sed -e "s/\/Users\/xxxxxx/~/g"
done
```
これでホームディレクトリからのパスとしてコピーできますね。