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

一瞬で「今日のディレクトリ」を作成・移動できるRuby/Bashスクリプト


ちょっとしたファイルを作成・保存しておきたい時、自分にとっては「今日の日付のディレクトリ」にまとめておくのが丁度よい。これまでは毎日手作業で「今日の日付のディレクトリ」を作成・移動していたのだけど、これを毎回やるのが面倒臭い。ということでスクリプトで自動化した。ちなみに環境はruby1.9.2。bash 3.2.48。

※追記
ブコメでご指摘いただいた通り、Ruby使わないでBashだけでできます...なぜわざわざRubyを使ったのか...そこにRubyがあったからです...

機能

・シェルで「. today」と入力すると「~/daily/今日の日付(yyyy_mm_dd)」ディレクトリを作成し移動する

実装にあたって

Rubyでディレクトリを作るのは簡単なのだが、現在のシェルを移動するのに一工夫必要だった。RubyでDir.chdirするだけでは、現在のシェルのディレクトリは移動しない(あくまでもrubyコマンドを実行したシェルの子プロセスとして動くから)。そこで「Rubyはディレクトリ作成後、移動コマンド(cd ...)を標準出力に吐き出す→吐き出されたコマンドを現在のシェルで実行する」という処理にした。

標準出力に吐き出された文字列をBashのコマンドとして実行するには「コマンド置換($()か``)」を使う

コマンド置換

コマンド置換 (command substitution) を用いると、 コマンド名をコマンドの出力で置き換えられます。...
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html

コマンドを現在のシェルで実行するには「.かsource」を使う

. filename [arguments]
source filename [arguments]

filename からコマンドを読み込み、現在のシェル環境の下で実行します。...
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html

コードを書く

Ruby

~/script/today.rb

today = Time.now.strftime "%Y_%m_%d"                                                                                                                                              
today_dir = File.expand_path("~/daily/#{today}")
Dir.mkdir(today_dir) unless File.exist? today_dir
puts "cd #{today_dir}"
Bash

today

#!/usr/bin/env bash                                                                                                                                                                                         

$(ruby ~/script/today.rb)

※「$()」は「``」でもOK

このBashコードに実行権限をつけてパスを通せば、準備完了。

実行

※追記
ご指摘いただいたので、lsの表示結果を掲載しました

例えば、今日の日付が2013年1月20日で、この状態から

$ pwd
/Users/hidenorimaehara
$ ls ~/daily
2013_01_18 2013_01_19

シェルで以下のコマンドを打つと

$ . today

※「.」は「source」でもOK

今日の日付のディレクトリが作成され移動できる。

$ pwd
/Users/hidenorimaehara/daily/2013_01_20
$ ls ../
2013_01_18 2013_01_19 2013_01_20

となる

Macなら、こうすれば、ディレクトリ移動後にそのディレクトリをFinderを開けて便利。

$ . today
$ open .

終わり

ちょっとしたスクリプトだけど、自分にとっては結構便利だった!