時々使う小物スクリプト集

※決して期待しないこと

i2n

inode to nameのつもり。
inode番号を引数に与えると、ファイル名を出してくれる。
...ありそうなコマンドなんだけどなぁ。
見つからないので自作した。
手抜きなのでカレントディレクトリのファイルしか見つけてこない。
というか、ls + sedだし。

#!/usr/bin/env bash

echo -n `ls -i1 | sed -n "s/^\s*$1\s*//p"`


時々X立ち上げずにコンソールで作業することがあるのだが、そういう時に使うスクリプト
具体的には日本語ファイル名なファイルにアクセスするときに使う。
使用例としてはこんな感じ。

[goth@wristcut(8) Movie]$ ls -i | jabanner #jabannerを使ってファイルを探す。

                                                         ##
 ###   ###   ###    #    ###  #####  ###          #     #  #  #           # ####
#   # #   # #   # ###   #   #     # #   #         #     ###   #    ##     #
    # #   # #   #   #   #   #    #  #   #         # #####     #  ##       #
  ##  #   #  ###    #   #   #    #   ###         #      #    #           #   ###
    #  #### #   #   #    ####    #  #   #        #      #    #           #
    #     # #   #   #       #   #   #   #        #      #    #           #
#   #     # #   #   #       #   #   #   #        #   ####    #   #       #   ###
#   #    #  #   #   #      #    #   #   #        #  #   ##   #   #       #  #
 ###   ##    ###    #    ##     #    ###         # ##   # #  # #  ####   # ##
                                                  #  ###      #           #  ###

[goth@wristcut(8) Movie]$ cd $(i2n 3981978) #上で得たinodeをi2nに渡してcdする。
[goth@wristcut(8) ????????DVD]$ mplayer -vo fbdev2 *.avi #めでたく動画を再生。

あ、preで括ってみたけどjabannerずれるかも。vimで:set pasteしてコピペするとちゃんと読める...やも。
ツッコミは無しの方向で。
ちなみにscreenを使って画面横分割*1して、上画面は空バッファ選択させて*2、高さを調整して*3やると動画見ながら下画面で*4作業できる。
BGMならぬBGVを流しつつ作業するので...。


ファイルシステムの云々を触ってinodeから名前を引っ張ってくるコマンドあると思うのだが...。
だれか知ってたら教えてくださいな。

2arg

to argumentのつもり。
引数のコマンドの実行結果を一時ファイルに吐いて、一時ファイル名を表示するスクリプト
というだけだとなんの意味があるか分からないスクリプトだが、意外に便利...カモシレナイ。
これまた$()で括って使う。

#!/usr/bin/env bash

TMP_FILE=`mktemp ${HOME}/tmp/2arg.XXXXXX`
eval $* > $TMP_FILE
echo $TMP_FILE

最近使って無いけどdiffのお供に時々使う。

$ diff oldfiles $(2arg find Document/)
5289a5290
> Document/hatena/hatena酢豚-scripts
5290a5292
> Document/hatena/hatena酢豚-acpi

微妙な具体例でごめんよ。
昔は定期的にMandrivaのパッケージ一覧とってたから、それとdiffる時に使ってたんだ。
よくよく考えると普通にパイプ使えばいい例だし。


ファイルしか引数にとれないけど、あるコマンドの実行結果を渡したい、って時に使う。
まぁ、自分で一時ファイル作ればいい話なんだけどね。
自分で作るとどうしてもhogehogeとかfugeraばかりになってしまうので...(苦笑


あとパイプだと一本しかとってこれないから

$ cat $(2arg ./a.out 10) $(2arg ./a.out 20) $(2arg ./a.out 30) > result

みたいな使い方もできるかも。
まぁ、いずれにせよリダイレクト">>"で済む話だけど。


あと、一時ファイルを自動で削除しないので定期的に"rm -f ~/tmp/2arg.*"をしないといけないというね。
自動削除したかったのだが、よくよく考えると無理...。
fuserとかで開放されるの待てばいいのかな?まぁいいや。最近使ってないし。

Wait4

wait forのつもり。
あるプロセスが終了するまで待つスクリプト
至極単純だけど意外に便利。

#!/usr/bin/env bash

while ps $* >/dev/null ; do
	sleep 5;
done


例えば、
あるコマンドを叩いたはいいが、意外に時間がかかるので寝よう。
ということは往々にしてよくあることで、一方でマシンつけっぱなのは如何なものかとby電子ちゃん。
そういう場合には"someProgram && poweroff"すればいいわけなのだが、起動してからその事実に気がつくこともある。
というか大半がそう。
起動してから、「あ、やべ。もうこんな時間か」とか思うのだが、一旦終了してからコマンドを打ち直すのも...。
そんな時にWait4。

$ ps af #プロセスIDを調べる
  PID TTY      STAT   TIME COMMAND
15181 pts/3    Rs     0:00 /bin/bash
16593 pts/3    R+     0:00  \_ ps af
14900 pts/1    Ss     0:00 /bin/bash
16074 pts/1    S+     0:02  \_ vim hatena酢豚-scripts
14715 pts/2    Ss     0:00 /bin/bash
16578 pts/2    R+     0:04  \_ /usr/bin/python -O /usr/bin/emerge -uDaN world
 ...略...
$ Wait4 -P 16578 && poweroff #プロセスID:16578(=emerge)が終了したらpoweroffが実行される。

内部はpsを叩いているだけなので"-C コマンド名"でもok

decompress

まんま、展開するスクリプト
その昔tarのオプションが覚えられなくて作ったスクリプト
オプションが脳髄まで染み渡った今では無用の長物。
あ、lhaだけは有用かも。

#!/usr/bin/env bash

for file in $* ; do
	case "$file" in
		*.tgz|*.tar.gz)
		echo "extract tar-gzip file..."
		tar -xvzf $file
		;;
		*.tbz2|*.tar.bz2)
		echo "extract tar-bzip file..."
		tar -xvjf $file
		;;
		*.gz)
		echo "extract gzip file..."
		gunzip $file
		;;
		*.bz2)
		echo "extract gzip file..."
		bunzip2 $file
		;;
		*.lzh)
		mkdir -p $(basename $file .lzh)
		lha ew=$(basename $file .lzh) $file
		;;
	esac
done

xが展開、vはverbose、zがgzipで、jがbzip2、fがファイル指定。
覚えられなかったんですよ。えぇ。
んで、作ったんですよ。えぇ。
いまじゃ勝手に手が動くというね...。
lhaはディレクトリ作らないやつが多いので強制的に作るようにしている。
zipも多いんだよね。フラットなやつ。
まぁ、普段使わない形式だし、どうでもいいんだけどね。



そんなこんなでグッナイ

*1:画面分割: S

*2:空バッファ選択: :select -

*3:高さ調整: :resize +n/-n

*4:フォーカス切り替え: Tab