◆はじめに
こんにちは.だんぷてぃ・ダイです.世の中の管理業務はスクリプトでほぼできんじゃね?と思い込んで30年,使い捨てのシェルスクリプトやsedやawkプログラムを何百と書き倒してきました.このシリーズはその中から「これ役に立つんじゃね?」と思ったものをお届けしていきます.
※おいらは「C-Shell(tcsh)使い」です.なので,Bashについてはあまり自信がありません.できる限り両方カバーするつもりですが…
今回のは正確にはスクリプトではなくエイリアスです.ディレクトリ移動(cd)した履歴を記録しておき,履歴番号でそのディレクトリに移動,というシロモノです.
$dhist,dcdのアイデア
change dir(cd)を繰り返していると,何回か前のディレクトリに行きたいことがありませんか.私はあります.ありまくります.
cdしたら移動前の場所を記録しておいて,それを参照したり過去に移動したディレクトリに一発で移動できると便利だなぁ.
次のようなコマンドです.
コマンド: 使い方
---------------------------
dhist : 引数なし.番号付きでヒストリーをリスト表示
dcd [num] : 引数1個.ヒストリーの番号でそのディレクトリにcd
$準備作業あり
上のコマンドをシェルのaliasで実装しますが,あらかじめやっておく作業があります.
-
~/.dhist という空ファイルを作成しておきます.
$ touch ~/.dhist
.dhistファイルはcdの履歴を入れるファイルです.これがないとシェル様に怒られます(ファイルがなければ勝手に作るプロセスを入れればいいんです.が,エイリアスの中で例外処理するが面倒で.1回作ればいいんですから(^^)).
-
行番号をつけてファイルの中身を表示するコマンドを用意します.今回は自作スクリプト "num" を使います.簡単なawkスクリプトです.
#!/usr/bin/awk -f { printf("%4d %s\n",FNR,$0) }
スクリプトの中身をaliasに入れ込んでもいいのですが,面倒で(^^)1.
本体を以下に説明します.
$スクリプト本体
私は今も昔もC-Shell(tcsh)使いです.なので,実装したのはC-Shellのエイリアスです.が,Born-Shell(bash)でもできるので後述します.
<1> csh版
C-Shell版はaliasだけで完結します.
alias cd 'echo $cwd >> $HOME/.dhist;chdir \!*;echo $cwd''
alias dhist 'num $HOME/.dhist|tail -20'
alias dcd 'cd `tail -n +\!* $HOME/.dhist|head -1`'
履歴サイズは20にしていますが好きに変更して下さい2.中身は読んでいただければわかります.が,念の為このaliasの解説は後述します.
<2> bash版
bashのエイリアスは引数を受け付けられない3ので,面倒だけどfunctionで関数を定義します.aliasはこんな感じ.
alias dhist='num $HOME/.dhist|tail -20'
alias cd='/bin/pwd >> $HOME/.dhist;\cd $@'
で,dcd関数は3行です.
# cd from dir history
dcd(){
\cd $(tail --lines=+$1 ~/.dhist|head -1)
}
※ご存知ない方に:aliasは特に別ファイルを用意する必要はなく,~/.bashrcに書けばOKです.これを有効にするにはsourceします.
$ source ~/.bashrc
※使い方はどちらのシェルも同じです.
% cd hogedir
→ cdは特に意識せずに使って下さい.
※cshのpushd/popdを使うと記録されません.
% dhist
052 /hoge/dir/work
053 /home/mydir
054 /home/mydir/down
......ズラズラ
071 /home/mydir
→ 過去にcdしたディレクトリを番号付きで20行表示.
% dcd 52
/home/dir/work
→ 履歴5番目のディレクトリに移動.
私にとってはめちゃ便利です.
$やっていること
大したことやってません.
1. cdの都度,今の場所を~/.dhistファイルに追加書出しておく
2. dhistではnumスクリプトに通して番号表示し,tailで20行抜き出し,.
3. dcdでは,tailで.dhistの中から指定された番号の行を指定し,
4. headでその1行だけを表示し,
5. それをcdの引数に放り込む
これだけです.
お楽しみいただければ幸いです.
だんぷてぃ・ダイ
2020-02-18 LastEdit