結論
$ tree -dfi os | ruby -ryaml -e 'puts YAML::dump(ARGF.map{|e|"src/"+e.chomp}.slice(0..-3))'
参考:一つ前のバージョン
$ tree -dfi os | ruby -ryaml -ne '(data ||= []) << %Q(src/%s) % [$_.chomp]; END{ data.slice!(-3..-1); puts YAML::dump(data)}'
出力見本
- src/os - src/os/core - src/os/core/lib - src/os/core/sys ... - src/os/platform/cpu/avr/dev/usb/serial - src/os/platform/cpu/native
……ワンライナーとギリギリ言い張れるレベルに収まりました(震え声
個別
tree
-i
ツリーコマンドのiオプションは名前の由来でもあるインデントまわりを綺麗にしてくれます。
-d
ディレクトリのみ表示
ruby
$_
標準出力から持ってくる組込み変数です。
chompと組み合わせて使わないと、%での文字生成で最後に処理されるため、変な感じになります。
-n
while ARGF.gets ~~ endを省略してくれる素敵オプションです。
||=
空オブジェクトの場合、後ろにあるオブジェクトを突っ込んでくれます。
速度を求める場合、最初にBEGIN{data =[]}とした方が多分速いです。
今回は文字数を減らしたいのでこうしました。
参考もと
- ディレクトリ構造のドキュメント化に便利なtreeコマンドのオプション一覧(linux)
- ruby ワンライナーの使い方まとめ - それマグで!
- http://docs.ruby-lang.org/ja/1.9.2/library/yaml.html
編集記録
- 帰宅中にmap使えば良いという単純な事実に気付き修正