題 Mac OS X相當於Ubuntu“樹”命令


有沒有相當於Ubuntu tree 命令 對於Mac OS X?


273
2017-11-21 10:38


起源




答案:


你可以得到 tree 也可以在macOS上執行命令。如果你有 家釀,你需要做的就是運行:

brew install tree

繼續閱讀以了解詳情。


使用包管理器

有幾個macOS包管理器。最受歡迎的是: 家釀MacPorts的, 要么 芬克。你可以安裝任何一個,但我推薦Homebrew。不要同時安裝多個!

按照網站上的說明操作,然後根據您選擇的軟件包管理器運行以下命令之一。

對於Homebrew:

brew install tree

對於MacPorts:

sudo port install tree

對於芬克:

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"

重新加載shell,現在 which tree 應該指出 /usr/local/bin/tree


385
2017-11-21 10:52



@slhck:謝謝!安裝 家釀 + brew install tree 像魅力一樣工作:) - Misha Moroshko
@DavidMoles因為只是運行 make 在OS X上不起作用。首先,您必須知道如何安裝Xcode命令行工具(或者通常,對構建軟件有一些了解),然後您會發現它在未定義的符號上出錯。所以你必須對makefile做一些調整(如上所述) 這裡)。太麻煩的IMO。 - slhck
@ 7stud許多人都知道一些用於非常簡單的CLI任務的命令行工具,他們可能會這樣做 不 知道如何編譯軟件。人們有時很難理解什麼 ./configure 和 make 確切地說,以及為什麼首先需要這些。或者他們不想處理它。或者閱讀任何幫助文件。他們寧願做類似的事情 apt-get install。如果您更喜歡來自源代碼的安裝(我個人也這樣做),那就沒關係了,但您必須接受其他人,或者甚至是大多數普通計算機用戶感覺更容易的解決方案。 - slhck
人們有時很難理解./configure並準確地做什麼以及為什麼首先需要這些  我已經從源代碼安裝了15年的軟件,我不知道是什麼 ./configure 和 make 做。我只知道他們是我需要執行的步驟才能安裝軟件。我盲目地閱讀了README和INSTALL文件,我做了它所說的一切。 - 7stud
@DhruvGhulati不是我所知道的,但你可以反過來 - grep 它。喜歡 tree | grep -v 'json' 或類似的。 - slhck


不完全相同,但Mac上的一個快捷方法是:

find .

就是這樣。它將列出當前目錄中的所有文件路徑。


27
2018-05-02 13:31



如果對特定目錄感興趣:find ./ <dir_name> - raspacorp
如果只對文件感興趣, find . -type f - Jared Beck
我只想深入了解目錄結構 find . -type d -maxdepth 2 為我工作 - Matthew Lock
更好用 find * 如果你不想看到隱藏的文件和目錄。 tree 默認情況下不顯示隱藏的文件和目錄。 - asmaier


沒有正式的 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 

18
2017-11-21 10:53



它錯過了所有的選擇 tree,但仍然是一個很好的小解決方案。 - slhck
@slhck嘿嘿這是一個快速的黑客解決方案...... - Ahmed Masud
您可能想要引用您的變量。 - slhck
@JenS。當然你可以簡單地改變find命令來處理它 - Ahmed Masud
天才 - 喜歡它。 - xaphod


你可能應該使用 自製。如果你這樣做:

brew install tree

18
2018-06-30 16:30



我正準備回答這個問題。不錯的表演。 - alfonso
簡單而有力的建議。謝謝。 - Gearon


或者,如果您的管理員不允許您安裝任何 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。

致敬 肖恩查普曼 他的博客上的原始帖子。


16
2017-07-14 23:09



無法到Shaun的網站;感謝您提前修改Makefile。 - Paul Nathan
具體來說,你可以添加 force_color = TRUE;。沒有分號,你得到一個編譯錯誤。 - tgrosinger
我剛剛構建了1.7版而不是版本 setLocale 它的 setlocale。所以 tree.c,你找 setlocale(LC_TYPE,"");謝謝! - Avi Cohen
很好的答案。你可以添加一個關於如何移動它的說明 /bin (或某些路徑,以便它可以全局使用)? - Khanh Nguyen
僅供參考,在Yosemite下編譯1.7.0我得到: warning: format specifies type 'long' but the argument has type 'long long'。解決方法是更改​​格式說明符 %9ld 至 %9lld。 - David Moles


另一種選擇 find 和 awk

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

5
2018-04-07 12:10





添加一個小點 @ apuche的回答 對於OSX El Capitan 無根 特徵。 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


3
2018-01-12 03:16



嗯,這在技術上有效。但它是侵入性的。所以你可能會跑 ./configure --prefix=/usr/local 在跑步之前 make 和 make install 它會達到同樣的效果。 - JakeGould
@JakeGould絕對,我確實使用過 prefix 在這種情況下。但沒有 configure 文件在最新版本中 樹 (1.7.0)現在。該 INSTALL 解壓縮目錄中的文件只是說要使用 make 和 make install 馬上。 - vikas027


我將以下內容添加到〜/ .bash_profile中以便在Terminal.app中使用。包含一些註釋以幫助記住如何使用查找。

##########
## 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
2018-06-05 02:20





這是一個Ruby腳本解決方案,它可以生成一個漂亮的Unicode樹以及有用的元數據。

#!/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
2017-11-27 19:19



非常感謝輕量級解決方案!在OSX 10.9.5(運行庫存Ruby 2.0.0)上,由於'沒有隱式轉換為true到String(TypeError)'錯誤,我不得不改變#tree方法的第六行來讀取file = File.basename (路徑)+(File.directory?(path)?'/':'') - joel.neely


我找到了一個簡單的解決方案: 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

2
2017-10-09 07:34





它不像gnu樹那麼漂亮......但它真的很容易在bash中別名...你甚至可以通過在osx的ls顏色上添加G選項來添加一點顏色。

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

1
2018-06-08 07:30