find で 複数のコマンドを実行する

find コマンド取得したパスは -exec オプションを使って コマンドを実行することができます。

$ find . -mtime 3 -exec rm {} \;

-exec を複数書くと 複数のコマンドを実行することができます。

$ find . -mtime 3 -exec echo {} \; -exec rm {} \;

type コマンドの結果の "is hashed"

type コマンドで 情報を表示すると たまに "is hashed" と表示されることがあります。

$ type sl
sl is hashed (/usr/games/sl)

なんだろう?と思って調べてみると 下のサイトに「コマンドの場所へ高速にアクセスするために、よく使用するパスをキャッシュにとっていて、ハッシュテーブルがそのキャッシュ」と 書いてありました。

[参考]
typeとwhichの違いって? - OpenGroove

なるほど。

現在ハッシュテーブルにキャッシュされているコマンドは hash コマンドで確認できます。

$ hash
hits    command
   1    /usr/bin/man
   3    /usr/games/sl

hash コマンドは シェルの組み込みコマンドです。

$ type hash
hash is a shell builtin

"-r" オプションで ハッシュテーブルを削除できます。

$ hash -r

削除後に確認してみます。

$ hash
hash: hash table empty

空になっています。

ハッシュテーブルが空になった状態で もう 1 度見てみます。

$ type sl
sl is /usr/games/sl

"is hashed" が表示されなくなりました。

trap コマンドは、シェルの組み込みコマンド

この前の 補足になるのですが、 trap コマンドは シェルの組み込みコマンドです。

とりあえず which コマンド。

$ which trap

検索パスにないため 何も表示されません。

type コマンドで 情報を表示することができます。

$ type trap
trap is a shell builtin

シェルの組み込みコマンドの場合 パスではなく "shell builtin" と表示されます。

cd や alias コマンドなども同様です。

$ type cd
cd is a shell builtin

$ type alias
alias is a shell builtin

組み込みコマンドでないと "shell builtin" 以外が表示されます。

$ type find
find is /usr/bin/find

$ type ls
ls is aliased to `ls -F'

ただし、組み込みコマンドでも コマンドが alias を設定されていると "is aliased" と 表示されます。
("-t" オプションは型のみ表示)

$ type -t cd
builtin

$ alias cd="cd"

$ type -t cd
alias

$ unalias cd

$ type -t cd
builtin

ちなみに type コマンドも組み込みコマンドです。

$ type type
type is a shell builtin

シェルスクリプトの終了時に処理を実行させたい

ロックファイルや一時ファイルの削除など、シェルスクリプトの終了時に 実行したい処理というのがあります。 異常終了時に削除しておかなければならない場合など 毎回記述するのは大変です。

そんなときに使える trap というコマンドがあります。

trap コマンドは次のように処理とシグナルを指定します。

trap "echo hogehoge" EXIT

とりあえずコマンドラインで試してみます。

INT は [Ctrl]+[c] などによる割り込みのシグナルです。

$ trap "echo hogehoge" INT

[Ctrl]+[c] を押すと "echo hogehoge" を実行します。

$ trap "echo hogehoge" INT

$ ^Chogehoge

$ ^Chogehoge

解除するにはシグナルだけを指定します。

$ trap INT

$ ^C

[Ctrl]+[c] を押しても何もおこりません。

シェルスクリプトの中に 次のように書いておけば 終了時にファイルを削除してくれます。

trap "rm text1.txt" EXIT

EXIT はプロセス終了時のシグナルなので シェルスクリプトの終了をトラップしてくれます。

処理の進行状態によって削除するファイルが増えるときは 次のように再定義する方法で対応することもできます。

DELFILE="${DELFILE} test1.txt"
trap "rm ${DELFILE}" EXIT

(...処理....)

DELFILE="${DELFILE} test2.txt"
trap "rm ${DELFILE}" EXIT

現在の設定内容は "-p" オプション、 シグナルの一覧は "-l" オプションで 表示させることができます。

Google サイト内検索

Amazonアソシエイト