以前 sed(1) を利用した tree コマンドの実装が投稿されていたので、awk(1) 版を投稿。
ワンライナーで済む分だけ sed(1) 版の方が遙かに美しいですが折角なので。
遙か昔 (1997年頃) に必要に迫られてでっち上げたスクリプトなので、表示が崩れるなど不具合のある可能性もありますがそのまま公開しちゃいます。
#!/bin/sh
LANG=C
du -a $* |
sort -k 2|
awk '{
num = split($2, path, "/")
max = (max < num) ? num : max
for(i=1; i<=num; i++)
if(old[i] == path[i])
printf(" |")
else
break
printf("- %s \n", path[i])
old[i] = path[i]
while(++i <= max)
old[i] = ""
}'