読者です 読者をやめる 読者になる 読者になる

ちょっといきぬき

vimとかpythonとかロボットとかMLとか環境構築とかの興味ある技術のことを書きたいだけの人生だった。

AutomatorとPythonでWindows/Macの共有フォルダパスを相互変換する話。

(※はてな初心者なので画像の出し方が分からぬ…)

会社で共有フォルダを使って作業していると
Windowsユーザーからは

ファイル共有しました。
\\hoge\fuga\piyo\file

Macユーザーからは

以下のパスに共有しました。
smb://hoge/fuga/piyo/file

といった連絡が入ってきて、お互いに

\\hoge\fuga\piyo\file ⇄ smb://hoge/fuga/piyo/file  

とパスを書き換える必要が出てきます。

一般的にはマイノリティなMacユーザーがダルそうにしながら
パスを書き換えるらしいです。

こういったやり取りが毎日行われているらしく、 自動化できないか相談を受けたため調べて解決した話を記述します。

動作確認環境

MacBook Pro (Retina 13-inch、Early 2015)
OS X El Capitan 10.11.6
Python 2.7.10 (OSデフォルトのもの)

機能概要

・それぞれのパスのテキストを範囲選択→右クリックメニューにパス変換機能を表示したい
・パス変換メニューを選択したら変換後のパスをクリップボードにコピーしたい
・あわよくばショートカットキーとして登録したい

使用したもの

Automator

[f:id:hi_ro_kun28:20170512130229p:plain]

Mac標準の作業自動化ツールです。
これでサービスという形でMacに機能を追加し、
右クリックメニューに表示することが出来ます。

Python

[f:id:hi_ro_kun28:20170512130256p:image]

最近統計やらAI分野で人気のスクリプト言語です。
こちらもMacに標準でインストールされているため設定不要です。
今回はAutomatorのワークフロー内にPythonコードを記述しました。

最初にやってダメだったこと

Automatorの基本的な使い方は知ってる前提です。
AutomatorでWin→Macパス変換とMac→Winパス変換のサービスを作成してシェルスクリプトを実行アクション内に以下のスクリプトを記述した。

Win -> Mac

#!/bin/bash
sed -E 's/\\\\|¥¥+/smb:\/\//' | sed -E 's/\\|¥/\//g' | tr -d '\n' | pbcopy

Mac -> Win

#!/bin/bash
pbpaste | sed -E 's/smb:\/\//\\\\/' | sed -E 's/\//\\/g' | tr -d '\n' | pbcopy

ポイントは入力の受け渡し方法を「stdinへ」にする

問題点

・できれば1つのメニューで相互変換させたい
シェルスクリプトの熟練度不足のため躊躇する

・/bin/bashからsedコマンドで変換→pbcopyすると貼り付けるテキストの \ が ¥ になってしまう
→環境の問題かもしれないが、¥に変換されるのは好ましくない

反省点を元にAutomatorPythonを使う

あまり検索したページに載っていませんでしたがシェルスクリプトを実行アクションでPythonが選択できたので以下のような構成にしてみました。

[f:id:hi_ro_kun28:20170512130444p:plain]

ソースコードは以下の通りです。
正規表現初心者で簡易的な作りのためご容赦下さい。

# coding: utf-8
import re
text = raw_input()
if re.match(r"smb://", text):
    text = re.sub(r"smb://", r"\\\\", text)
    print re.sub(r"/", r"\\", text)
elif re.match(r"\\\\", text):
    text = re.sub(r"\\\\", r"smb://", text)
    print re.sub(r"\\", r"/", text)
else:
    raise Exception("WinパスかMacパスを選択して下さい。")

ポイントは次の3点です。
・上の「クリップボードにコピー」アクションからテキストがstdinで入力されるのでraw_input()で受け取る
・下の「クリップボードにコピー」アクションにテキストをstdoutで出力したいのでprint文を使う
・正しくないテキストを受け取った場合はエラーを出す
(但し、実際にエラーを出すと「アクション"シェルスクリプトを実行"でエラーが起きました。」と表示される。)

作成したワークフローをサービスとして登録すると
/Users/$USER/Library/Services内に保存されます。

ショートカットキーとして登録したい場合は
システム環境設定→キーボード→ショートカットで行えるので
要件をバッチリ満たしていますね。

これで設定完了。

早速試してみる

それぞれのパスのテキストを範囲選択して右クリック→パス変換メニューを選択すると
クリップボードにパス変換後のテキストがコピーされます。

Win → Mac

\\hoge\fuga\piyo\file → パス変換(変換後をコピー) → 貼り付け → smb://hoge/fuga/piyo/file

Mac → Win

smb://hoge/fuga/piyo/file → パス変換(変換後をコピー) → 貼り付け → \\hoge\fuga\piyo\file