コマンドラインでcdとかしたら勝手にlsするシェルスクリプト

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

ちょっと書いてみました!

# 移動したらすぐls -lah
# ただしファイルなどが20より多かった場合は
# lsで簡易表示
function chpwd() {
  if [ 20 -gt `ls -1 | wc -l` ]; then
    ls -lah
  else
    ls
  fi
}

zsh だと、chpwd という関数を定義してやるだけで、移動したときに動作する関数ができちゃうらしいです。 普通に ls とだけ入れておけば、移動したらすぐに一覧表示してくれたりするのですが、僕は ls -lah として、詳細も表示してました。

ただ落とし穴が・・・。

これでしばらく使ってたら、ファイル数が1000以上あるディレクトリを自動的に ls -lah してしまって、しかもPCが激重な状態だったので、しばらくずらずらと表示する事態に・・・。

これはいかん!と思って、ちょっと考えました。

testコマンド

この if の後にある [] ですが、シェルスクリプトでは test コマンドに相当します。 man test とかで詳しく載ってます。

※補足 man [ でも載ってました。知らなかった・・・。

これを使うと、数式の計算結果が真か偽かで 0 か 1 を返すことができ、その後の処理を if 文で場合分け出来ちゃったりするので、20よりファイル数(ディレクトリなど含む)が多いかどうかで判定してみました。

if [ 20 -gt `ls -1 | wc -l` ]; then

また、ls -1 | wc -l は、ls を1行単位で出力させつつ、それを後の入力に渡して(パイプ処理)、その行数を計ってます。

wc -l で行数のみを出力するので、結果的にファイル数が20より多いかどうかが判定できてます。(ちなみに -gt は greater than つまり『より大きい』の略ですね)

UNIXの Small is beautiful. な思想に感動しつつ、大量の出力を避けるシェルスクリプトも書けて万々歳です。(30分ほど仕事が進んでおりませんでしたが・・・)

参考URL

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。