よく使う作業ディレクトリをシェルスクリプト内にまとめておいて一発で移動できるようにしておくと便利だなぁと思って書いたスクリプトです。
作業ディレクトリがある程度一箇所にまとまっていれば cdコマンドで行ったり来たりするのも別に面倒ではないのですが、
$ . command keyword のようにキーワードを打ち込んで移動できれば、フルパスを打ち込んだり、Finderからフォルダをドラッグする手間を省けます。
シェルスクリプトの作成
「move_to」というスクリプト名にしてみました。
#!/bin/sh # #usage: $ . move_to keyword #移動先のフルパス toDir="" #コマンドで入力したキーワード keyword="$1" #case文を使ってキーワードと移動先のディレクトリをマッチさせる case "$keyword" in bin ) toDir="/usr/local/bin" ;; doc ) toDir="/Users/who/Documents" ;; blog ) toDir="/Users/who/Documents/blog" ;; esac #$toDir が空じゃなかったら cdコマンドと lsコマンドを実行 if [ "$toDir" != "" ] then cd "$toDir" ls else #キーワードにマッチする移動先がなかったらエラーを表示する echo "$keyword: keyword not found" #move_toスクリプトで使用出来るキーワード/移動先の一覧を表示する echo "Choose below..." perl -ne 'print "\t$1\t$2\n" if m/^\s+([^\s\)]+)[^"]+"(.+)"\s*\;\;$/ms' move_to fi
少し解説
#コマンドで入力したキーワード keyword="$1"
move_toコマンド(スクリプト)で引数に指定されたキーワードを、位置パラメータ($1)を使って変数に格納しています。
ちなみに位置パラメータで $0 はコマンド(スクリプト)の名前が入るので、最初の引数は $1 になります。
#case文を使ってキーワードと移動先のディレクトリをマッチさせる case "$keyword" in bin ) toDir="/usr/local/bin" ;; doc ) toDir="/Users/who/Documents" ;; blog ) toDir="/Users/who/Documents/blog" ;; esac
キーワードと移動先ディレクトリの組み合わせが一目瞭然なので case文を使用しています。
case文を書く時は文末の「;;」を忘れないように。
#move_toスクリプトで使用出来るキーワード/移動先の一覧を表示する echo "Choose below..." perl -ne 'print "\t$1\t$2\n" if m/^\s+([^\s\)]+)[^"]+"(.+)"\s*\;\;$/ms' move_to
正規表現を使ったPerlワンライナーの部分を解説すると…
perl -ne
-neスイッチは、指定したファイル(この場合は move_toスクリプト、つまり自分自身)を先頭から最終行まで順に読み込みます。
つまり暗黙に while(<>){…} を回してるのと同じ意味になります。
print "\t$1\t$2\n"
上記の $1, $2 は前述の位置パラメータとは別物です。
このあとの正規表現の中でマッチ&キャプチャした文字列が格納される変数のことです。
if m/^\s+([^\s\)]+)[^"]+"(.+)"\s*\;\;$/ms
頭の if は、その後に続く正規表現によるパターンマッチの成功/不成功によって print を実行するかしないかを決めるための条件分岐です。
正規表現の部分は少し複雑ですね。
xフラグを付けてコメント付きで書き直すと次のようになります。
m/ #パターンマッチを行う ^ #行の先頭を表す ^アサーション \s+ #行の先頭にはまず空白が幾つかある ( #先頭の空白が終わった直後に登場するキーワードをキャプチャ開始 [^\s\)]+ #キーワードの後にはスペースまたは「)」があるので、それ以外の文字 ) #キーワードのキャプチャ終わり⇒ $1 に格納される [^"]+ #このあとにキャプチャしたい移動先ディレクトリは " で囲まれてるので、" 以外の文字の連続 "(.+)" #" から " の間にある移動先ディレクトリの文字列をキャプチャ⇒ $2 に格納される \s* #スペースがあるかないか \;\;$ #行の最後は「;;」で終わる。$ は行末アサーション /msx
上記の正規表現を使って「 bin ) toDir=”/usr/local/bin” ;;」のような行から「bin」と「/usr/local/bin」の部分を抜き出しています。
スクリプトがひと通りできたら、chmod a+x ScriptFile のように打ち込んで実行権限を与えます。
. (ドット)コマンドで実行
今回作った move_to というスクリプトを $ move_to keyword のように打ち込んでもスクリプト内の子プロセスで cdコマンドが実行されるだけです。
現在作業している親プロセスのディレクトリをスクリプト内の cdコマンドで移動されすには . (ドット)コマンドを使って下記のように実行します。
$ . move_to keyword