こんな風にファイル・ディレクトリ一覧を木構造で表示するコマンド。

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

最新版のtreeはhttp://mama.indstate.edu/users/ice/tree/で手に入る。最新版の1.6.0のファイルは2011年6月24日に更新されているので、まだ活発に更新されている!?

インストール

最初からインストールされているディストリビューションもあるようだが、自分のホームディレクトリにインストールする場合はこんな感じ(FreeBSDの場合)。

$ mkdir -p ~/local/{src,bin}
  
$ cd ~/local/src
  
$ curl -O ftp://mama.indstate.edu/linux/tree/tree-1.6.0.tgz
  
$ gzip -dc tree-1.6.0.tgz | tar xvf –
  
$ cd tree-1.6.0
  
$ vim Makefile
  
:
  
#prefix = /usr
  
previx = ${HOME}/local
  
:
  
\# Linux defaults:
  
#CFLAGS=-ggdb -Wall -DLINUX -D\_LARGEFILE64\_SOURCE -D\_FILE\_OFFSET_BITS=64
  
#CFLAGS=-O4 -Wall -DLINUX -D\_LARGEFILE64\_SOURCE -D\_FILE\_OFFSET_BITS=64 <- コメントアウト
  
#LDFLAGS=-s <- コメントアウト
  
:
  
\# Uncomment for FreeBSD:
  
CFLAGS=-O2 -Wall -fomit-frame-pointer <- アンコメント
  
LDFLAGS=-s <- アンコメント
  
OBJS+=strverscmp.o <- アンコメント

FreeBSD以外の場合はアンコメントの場所を変えるだけ。

Makefileを変更したら、makeだとエラーが出るので、gmakeを使う。

$ gmake && gmake install

あとPATHも通しておく。

export PATH="$HOME/local/bin:$PATH"

をドットファイルの書いておくとか。

こちらにインストールするためのスクリプトを書いた

$ curl -L https://raw.github.com/tmsanrinsha/dotfiles/master/setup/tree.sh | bash

でインストールできるはず。

使い方

使い方はお好みのディレクトリでtreeと打つ。

-Fを付けるとファイルタイプを表すシンボルが付く。-Cを付けるとカラーになる。

あとはmanで確認する。

注意点

LC_CTYPEがja_JP.UTF-8ののとき、自分の環境(FreeBSD + Tera Term)では文字化けが起こった(LC_CTYPEを確認するにはenv | grep LC_CTYPEと打つ。ない場合はLC_ALLの設定が使われ、LC_ALLの設定がない場合はLANGの設定が使われる)。

% tree \`pwd\`
  
/home/tmiwa/local/src/tree-1.6.0
  
├&#8211; CHANGES
  
├&#8211; INSTALL
  
├&#8211; LICENSE
  
├&#8211; Makefile
  
├&#8211; README
  
├&#8211; TODO
  
├&#8211; color.c
  
├&#8211; color.o
  
├&#8211; doc
  
│?? ├&#8211; tree.1
  
│?? ├&#8211; tree.1.fr
  
│?? m&#8211; xml.d├d
  
├&#8211; hash.c
  
├&#8211; hash.o
  
├&#8211; html.c
  
├&#8211; html.o
  
├&#8211; strverscmp.c
  
├&#8211; strverscmp.o
  
├&#8211; tree
  
├&#8211; tree.c
  
├&#8211; tree.h
  
├&#8211; tree.o
  
├&#8211; unix.c
  
├&#8211; unix.o
  
├&#8211; xml.c
  
└&#8211; xml.o

1 directory, 25 files

LC_CTYPE=Cを設定しておくと、文字化けが起こらなくなる。それに伴い、記号が変化するけど。

├     ->     |-
└     ->     `

補足

ちなみにWikipediaにはUNIXコマンドをパイプでつなげてtreeを実現する例が載っている。

find と sed で tree コマンドをつくる例はこちら