Ubuntuの「ツリー」コマンドに相当するMac OS X


回答:


438

treemacOSでもコマンドを取得できます。Homebrewを使用している場合、実行する必要があるのは次のとおりです。

brew install tree

詳細をお読みください。


パッケージマネージャーを使用

macOSにはいくつかのパッケージマネージャーがあります。最も人気があるのは、HomebrewMacPorts、またはFinkです。どちらでもインストールできますが、Homebrewをお勧めします。これらの複数を同時にインストールしないでください!

Webサイトの指示に従い、選択したパッケージマネージャーに応じて、次のコマンドのいずれかを実行します。

Homebrewの場合:

brew install tree

MacPortsの場合:

sudo port install tree

Finkの場合:

fink install tree

パッケージマネージャーは、デフォルトでmacOSに付属していないGNU / Linuxなど、他のコマンドラインプログラムを提供します。

ソースからインストールする

まず、を実行してXcodeコマンドラインツールをインストールする必要がありますxcode-select --install

次に、ソースをダウンロードしtreeます。次に、Makefileを変更して機能するようにします。これについては、以下の@apucheの回答でも説明しています。Linuxオプションをコメント化し、macOSオプションのコメントを外すだけで十分です。

次に、を実行し./configure、次にを実行しmakeます。

ここで、treeバイナリファイルを実行可能パス内の場所に移動する必要があります。例えば:

sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree

を編集して以下~/.bash_profileを含めます:

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

シェルをリロードすると、which treeをポイントするはず/usr/local/bin/treeです。


shaunchapmanblog.com/post/329270449/…にも詳細な手順があるようですが、Xcode 4.xを実行している場合、/ Developerの下にあるllvm-gccで問題が発生する可能性があります。少しいじるだけでうまくいくはずです。
アーメドマスード

1
@DavidMoles makeOS Xで実行するだけでは機能しないためです。最初に、Xcodeコマンドラインツールのインストール方法を知っておく必要があります(または、一般に、ソフトウェアの構築についてある程度の知識があります)。次に、未定義のシンボルでエラーが発生することがわかります。そのため、メイクファイルを調整する必要があります(ここで説明します)。面倒なIMOが多すぎます。
slhck

3
@ 7stud多くの人は、非常に単純なCLIタスク用のいくつかのコマンドラインツールを知っていますが、ソフトウェアのコンパイル方法を知らないかもしれません。人々は時々かを理解するために苦労./configureし、makeそれらが最初の場所で必要とされる理由を正確に行うと。または彼らはそれに対処したくない。または、ヘルプファイルを読んでください。彼らはむしろのようなことをしたいapt-get installです。あなたがソースからのインストールを好むなら(そして私も個人的には)、それは問題ありませんが、他の人、あるいはおそらく通常のコンピューターユーザーの大部分でさえ容易に知覚されるソリューションがあることを受け入れなければなりません。
slhck

1
人々は時々何に./configureと正確に間に合わせると、それらが最初の場所で必要とされている理由を理解するのに苦労し 、私は15年間のソースからソフトウェアをインストールしてきた、と私は何を何のアイデアがない./configuremakeやるの。ソフトウェアをインストールするために実行する必要がある手順であることを知っています。私は盲目的にREADMEファイルとINSTALLファイルを読み、それが言うことは何でもします。
7スタッド

1
@DhruvGhulati私が知っていることではありませんが、逆にすることもできますgrep。好きtree | grep -v 'json'か似ている。
-slhck

33

まったく同じではありませんが、Macでの簡単な方法の1つは次のとおりです。

find .

以上です。現在のディレクトリ内のすべてのファイルパスがリストとして表示されます。


特定のディレクトリに関心がある場合:find ./ <dir_name>
raspacorp

ファイルにのみ関心があれば、find . -type f
ジャレッド・ベック

2
私は、ディレクトリ構造表示の深いいくつかのレベルに行くだけで興味があったfind . -type d -maxdepth 2私のために働いた
マシュー・ロック

find *非表示のファイルとディレクトリを表示したくない場合は、より適切に使用してください。treeデフォルトでは隠しファイルとディレクトリを表示しません。
asmaier

find万金油ツールです。
エヴァン・フー

22

または管理者は、あなたが任意のインストールさせません場合はbrewfinkportあなたは常にソースからビルドすることができますツール:

curl -O ftp://mama.indstate.edu/linux/tree/tree-1.5.3.tgz
tar xzvf tree-1.5.3.tgz
cd tree-1.5.3/
ls -al

Makefileを編集して、Linuxパーツをコメント化し、osxエリアのコメントを外します。

# Linux defaults:
#CFLAGS=-ggdb -Wall -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#CFLAGS=-O2 -Wall -fomit-frame-pointer -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#LDFLAGS=-s

# Uncomment for OS X:
CC=cc
CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp
LDFLAGS=
XOBJS=strverscmp.o

オプション:カラー出力の強制

そして、あなたがそこにいる間に、ツリーに常に出力を色付けさせたい場合は、いつでもファイルのmainメソッドを編集し、前にtree.c追加することができますforce_color=TRUE;setLocale(LC_TYPE,"");

最後にヒットmakeすればtree、Mac用のビルドは完了です。

トリビュートは、ショーンチャップマンのブログに彼のオリジナルの投稿を掲載しています。


ショーンのウェブサイトにアクセスできませんでした。Makefileの修正にご協力いただきありがとうございます。
ポールネイサン

具体的には、を追加できforce_color = TRUE;ます。セミコロンなし。コンパイルエラーが発生します。
tgrosinger

1
バージョン1.7をビルドしsetLocaleましたsetlocale。だからtree.c、あなたが探しますsetlocale(LC_TYPE,""); ありがとう!
アヴィコーエン

素晴らしい答え。移動方法/bin(またはグローバルに使用できるようにするためのパス)についてメモを追加できますか?
Khanh Nguyen 14年

参考までに、ヨセミテで1.7.0をコンパイルしましたwarning: format specifies type 'long' but the argument has type 'long long'。修正は、形式指定子をから%9ldに変更すること%9lldでした。
デビッドモールズ

21

おそらくhomebrewを使用しているはずです。もしあなたがそうするなら:

brew install tree

18

正式なtreeコマンド自体はありませんが、これを行うことができます。

次のスクリプトを/ usr / local / bin / treeに保存します

#!/bin/bash

SEDMAGIC='s;[^/]*/;|____;g;s;____|; |;g'

if [ "$#" -gt 0 ] ; then
   dirlist="$@"
else
   dirlist="."
fi

for x in $dirlist; do
     find "$x" -print | sed -e "$SEDMAGIC"
done

実行できるようにアクセス許可を変更します。

chmod 755 /usr/local/bin/tree 

もちろん、作成する必要がある場合があります/usr/local/bin

sudo mkdir -p /usr/local/bin/tree 

のすべてのオプションを見逃しますがtree、それでもいい解決策です。
slhck

@slhck heheそれは簡単なハックソリューションだった...
アーメドMasud

ただし、変数を引用することもできます。
slhck

理由は「$ @を」の特殊な拡張の$ xは$ dirlistにはクォートするべきではありませんする必要があります...
アーメドMasud

1
@JenS。もちろん、あなたは、単にそれに対処するためにfindコマンドを変更することができます
アーメドMasud

5

findand を使用する代替手段awk

#!/bin/bash
find . -print 2>/dev/null | awk '!/\.$/ { \
    for (i=1; i<NF; i++) { \
        printf("%4s", "|") \
    } \
    print "-- "$NF \
}' FS='/'

4

ここで簡単な解決策を見つけました:http : //murphymac.com/tree-command-for-mac/

したがって、次のものを.bashrc.bash_profileまたは他の場所に追加すると機能します:

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

treeコマンドを追加すると、次のように出力されます。

# ~/my-html-app [13:03:45]$ tree
.
|____app.js
|____css
| |____main.css
| |____theme.css
|____index.html

3

OSX El Capitanのルートレス機能に関する@apucheの回答に小さなポイントを追加します。ディレクトリへの書き込みが許可されていないため失敗します。make install/usr/bin

vikas@MBP:~/Downloads/tree-1.7.0$ sudo make install
Password:
install -d /usr/bin
install: chmod 755 /usr/bin: Operation not permitted
install -d /usr/share/man/man1
if [ -e tree ]; then \
        install tree /usr/bin/tree; \
    fi
install: /usr/bin/tree: Operation not permitted
make: *** [install] Error 71
vikas@MBP:~/Downloads/tree-1.7.0$

これを克服するには、編集Makefileしてprefix = /usr/local


まあ、これは技術的に機能します。しかし、それは侵襲的です。だから、おそらく実行できる./configure --prefix=/usr/local実行する前に、makeそしてmake install、それは同じ結果を達成するであろう。
-JakeGould

2
@JakeGould絶対に、私はprefixそのようなシナリオで使用します。ただしconfigure、現在、ツリーの最新バージョン(1.7.0)にはファイルがありません。INSTALL解凍したディレクトリ内のファイルだけで使用することを言いますmakemake installstraightaway。
vikas027

2

Terminal.appで使用するために、以下を〜/ .bash_profileに追加しました。findがどのように使用されているかを覚えておくために、いくつかのコメントが含まれています。

##########
## tree ##
##########
## example ...
#|____Cycles
#| |____.DS_Store
#| |____CyclesCards.json
#| |____Carbon
#| | |____Carbon.json
# alternate: alias tree='find . -print | sed -e "s;[^/]*/;|____;g;s;____|; |;g"'
# use$ tree ; tree . ; tree [some-folder-path]
function tree {
    find ${1:-.} -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
}

現在のディレクトリの例

$> tree

いくつかのパスの例

$> tree /some/path

2

便利なメタデータとともに素晴らしいUnicodeツリーを生成するRubyスクリプトソリューションを次に示します。

#!/usr/bin/env ruby
def tree_hierarchy( root, &children )
  queue = [[root,"",true]]
  [].tap do |results|
    until queue.empty?
      item,indent,last = queue.pop
      kids = children[item]
      extra = indent.empty? ? '' : last ? '└╴' : '├╴'
      results << [ indent+extra, item ]
      results << [ indent, nil ] if last and kids.empty?
      indent += last ? '  ' : '│ '
      parts = kids.map{ |k| [k,indent,false] }.reverse
      parts.first[2] = true unless parts.empty?
      queue.concat parts
    end
  end
end
def tree(dir)
  cols = tree_hierarchy(File.expand_path(dir)) do |d|
    File.directory?(d) ? Dir.chdir(d){ Dir['*'].map(&File.method(:expand_path)) } : []
  end.map do |indent,path|
    if path
      file = File.basename(path) + File.directory?(path) ? '/' : ''
      meta = `ls -lhd "#{path}"`.split(/\s+/)
      [ [indent,file].join, meta[0], meta[4], "%s %-2s %s" % meta[5..7] ]
    else
      [indent]
    end
  end
  maxs = cols.first.zip(*(cols[1..-1])).map{ |c| c.compact.map(&:length).max }
  tmpl = maxs.map.with_index{ |n,i| "%#{'-' if cols[0][i][/^\D/]}#{n}s" }.join('  ')
  cols.map{ |a| a.length==1 ? a.first : tmpl % a }
end
puts tree(ARGV.first || ".") if __FILE__==$0

変更することができます meta = …行を表示するさまざまなメタデータを抽出し、次の行で分割されたピースを選択するます。もう少し作業を行うと、表示するメタデータを選択するために任意のls引数を渡すことができます。

サンプル出力(OS Xターミナルでは、Stack Overflowのフォントよりも見た目が良い):

phrogz$ tree UCC_IVI/
UCC_IVI/                               drwxr-xr-x  510B  Nov 20 11:07
  ├╴docs/                              drwxr-xr-x  102B  Nov 20 19:21
  │ └╴CANMessages.txt                  -rwxr-xr-x  2.2K  Nov 20 19:21
  │ 
  ├╴effects/                           drwxr-xr-x  204B  Nov 19 17:19
  │ ├╴Depth Of Field HQ Blur.effect    -rwxr-xr-x  2.4K  Nov 19 17:19
  │ ├╴FXAA.effect                      -rwxr-xr-x  1.6K  Nov 17 15:38
  │ ├╴HDRBloomTonemap.effect           -rwxr-xr-x   11K  Nov 17 15:38
  │ └╴SMAA1X.effect                    -rwxr-xr-x  4.4K  Nov 19 17:19
  │ 
  ├╴fonts/                             drwxr-xr-x  136B  Nov 17 15:38
  │ ├╴Arimo-Regular.ttf                -rwxr-xr-x   43K  Nov 17 15:38
  │ └╴OFL.txt                          -rwxr-xr-x  4.3K  Nov 17 15:38
  │ 
  ├╴maps/                              drwxr-xr-x  238B  Nov 19 17:19
  │ ├╴alpha-maps/                      drwxr-xr-x  136B  Nov 17 15:38
  │ │ ├╴rounded-boxes-3.png            -rwxr-xr-x  3.6K  Nov 17 15:38
  │ │ └╴splatter-1.png                 -rwxr-xr-x   35K  Nov 17 15:38
  │ │ 
  │ ├╴effects/                         drwxr-xr-x  136B  Nov 19 17:19
  │ │ ├╴AreaTex-yflipped.dds           -rwxr-xr-x  175K  Nov 19 17:19
  │ │ └╴SearchTex-yflipped.png         -rwxr-xr-x  180B  Nov 19 17:19
  │ │ 
  │ ├╴IBL/                             drwxr-xr-x  136B  Nov 17 15:38
  │ │ ├╴028-hangar.hdr                 -rwxr-xr-x  1.5M  Nov 17 15:38
  │ │ └╴FieldAirport.hdr               -rwxr-xr-x  1.5M  Nov 17 15:38
  │ │ 
  │ ├╴icons/                           drwxr-xr-x  238B  Nov 19 17:19
  │ │ ├╴icon_climate.dds               -rwxr-xr-x  683K  Nov 19 17:19
  │ │ ├╴icon_music.dds                 -rwxr-xr-x  683K  Nov 19 17:19
  │ │ ├╴icon_navigation.dds            -rwxr-xr-x  683K  Nov 19 17:19
  │ │ ├╴icon_phone.dds                 -rwxr-xr-x  683K  Nov 19 17:19
  │ │ └╴icon_surroundView.dds          -rwxr-xr-x  683K  Nov 19 17:19
  │ │ 
  │ └╴materials/                       drwxr-xr-x  102B  Nov 19 17:19
  │   └╴spherical_checker.png          -rwxr-xr-x   11K  Nov 19 17:19
  │   
  ├╴materials/                         drwxr-xr-x  102B  Nov 19 17:19
  │ └╴thin_glass_refractive.material   -rwxr-xr-x  6.0K  Nov 19 17:19
  │ 
  ├╴models/                            drwxr-xr-x  136B  Nov 19 17:19
  │ ├╴BokehParticle/                   drwxr-xr-x  136B  Nov 19 17:19
  │ │ ├╴BokehParticle.import           -rwxr-xr-x  739B  Nov 19 17:19
  │ │ └╴meshes/                        drwxr-xr-x  102B  Nov 19 17:19
  │ │   └╴Mesh.mesh                    -rwxr-xr-x  1.1K  Nov 19 17:19
  │ │   
  │ └╴Glass_Button/                    drwxr-xr-x  136B  Nov 19 17:19
  │   ├╴Glass_Button.import            -rwxr-xr-x  1.2K  Nov 19 17:19
  │   └╴meshes/                        drwxr-xr-x  136B  Nov 19 17:19
  │     ├╴GlassButton.mesh             -rwxr-xr-x   44K  Nov 19 17:19
  │     └╴Icon.mesh                    -rwxr-xr-x  1.8K  Nov 19 17:19
  │     
  ├╴scripts/                           drwxr-xr-x  204B  Nov 19 17:19
  │ ├╴App.lua                          -rwxr-xr-x  764B  Nov 17 15:38
  │ ├╴CANSim.lua                       -rwxr-xr-x   29K  Nov 17 15:38
  │ ├╴ObjectWiggler.lua                -rwxr-xr-x  3.7K  Nov 19 17:19
  │ └╴PathWiggler.lua                  -rwxr-xr-x  2.9K  Nov 17 15:38
  │ 
  ├╴states/                            drwxr-xr-x  170B  Nov 19 18:45
  │ ├╴app-camera.scxml                 -rwxr-xr-x  2.4K  Nov 20 11:07
  │ ├╴app-navigation.scxml             -rwxr-xr-x  590B  Nov 19 18:32
  │ └╴logic.scxml                      -rwxr-xr-x  4.2K  Nov 19 18:59
  │ 
  ├╴tests/                             drwxr-xr-x  102B  Nov 17 15:38
  │ └╴interface-navigation.scxml-test  -rwxr-xr-x   83B  Nov 17 15:38
  │ 
  ├╴UCC_IVI.uia                        -rwxr-xr-x  630B  Nov 19 17:32
  ├╴UCC_IVI.uia-user                   -rwxr-xr-x  832B  Nov 20 17:22
  ├╴UCC_IVI.uip                        -rwxr-xr-x  1.5K  Nov 17 15:38
  └╴UCC_Menu.uip                       -rwxr-xr-x   33K  Nov 19 17:19

2
軽量のソリューションに感謝します!OSX 10.9.5(標準のRuby 2.0.0を実行)では、「trueからString(TypeError)への暗黙的な変換」エラーのため、#treeメソッドの6行目をfile = File.basenameに変更する必要がありました(パス)+(File.directory?(path)? '/': '')
joel.neely

1

gnuツリーほどきれいではありませんが、bashでエイリアスを作成するのは本当に簡単です... osxのls色にGオプションを追加することで、少し色を追加することもできます。

alias tree='find . -type d | ls -lARG'

1
  1. Xcodeをインストールする

  2. コマンドラインツールを入手する

xcode-select --install
  1. Homebrewをインストールする
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. インストールツリー
brew install tree

1
2011年と2016年の2つの以前の回答で既に言及しました。同じことを言う3番目の回答が必要ですか?
ジェイソンS

0

ゲームに遅れたが、私は同じ質問を持っていた。職場の制限により、ソースから、またはサードパーティのパッケージマネージャーを介してパッケージをインストールできませんでした。

これは私の実装です:

# Faux tree command in OS X                                      

#####################################################################
# tree
# Recursive directory/file listing of present working directory 
#
# tree /Users/foo/foo_dir
# Recursive directory/file listing of named directory, e.g foo_dir
#
# tree /System/Library/ 2
# Recursive directory/file listing of named directory, 
# with-user defined depth of recursion, e.g. 2 
#####################################################################

tree ()
{
    [ -n "$2" ] && local depth="-maxdepth $2";
    find "${1:-.}" ${depth} -print 2> /dev/null | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
}

/Users/foo/.profileまたは.bash_profileに関数を追加してから、またはでプロファイルを更新しますsource .profilesource .bash_profile

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.