Mac OS X相当于Ubuntu“ tree”命令


Answers:


438

您也可以tree在macOS上获取命令。如果您有Homebrew,则只需运行:

brew install tree

继续阅读以获取详细信息。


与包裹经理

macOS有多个软件包管理器。最受欢迎的是:HomebrewMacPortsFink。您可以安装任何一个,但我建议使用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"

重新加载外壳程序,现在which tree应该指向/usr/local/bin/tree


shaunchapmanblog.com/post/329270449/…似乎也有详细的说明,但是如果您正在运行Xcode 4.x,则可能会导致住在/ Developer下的llvm-gcc出现问题;有点摆弄应该可以解决问题。
艾哈迈德·马苏德

1
@DavidMoles因为仅make在OS X上运行不起作用。首先,您必须知道如何安装Xcode命令行工具(或者通常对构建软件有一些想法),然后您会发现它在未定义的符号上出错。所以,你必须做一些调整,以生成文件(如解释在这里)。IMO太麻烦了。
slhck

3
@ 7stud很多人都知道一些用于完成非常简单的CLI任务的命令行工具,他们可能知道如何编译软件。人们有时会努力去理解到底要做什么./configuremake确切地做以及为什么需要这样做。或者他们不想处理它。或阅读任何帮助文件。他们宁愿做类似的事情apt-get install。如果您更喜欢从源代码安装(我也这样做),那很好,但是您必须接受其他人甚至大多数普通计算机用户都认为更容易的解决方案。
slhck 2015年

1
人们有时很难理解什么./configure和make究竟为什么那些需要首先 我从源15年被安装软件,我不知道./configuremake做到。我只知道它们是我安装软件所需执行的步骤。我盲目地阅读了README和INSTALL文件,然后按我说的做。
2015年

1
@DhruvGhulati我不知道,但是你可以反过来grep。喜欢tree | grep -v 'json'或相似。
slhck '16

33

不完全相同,但是在Mac上,一种快速的方法是:

find .

就是这样。它将列出当前目录中的所有文件路径。


如果对特定目录感兴趣:查找./ <
dir_name

如果只对文件感兴趣,find . -type f
Jared Beck

2
我只是在去深展现这样的目录结构几级有兴趣的find . -type d -maxdepth 2工作对我来说
马修锁定

find *如果您不想看到隐藏的文件和目录,请更好地使用。tree默认情况下不显示隐藏的文件和目录。
asmaier '18

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版的构建。

致敬Shaun Chapman在他的博客上发表了他的原始帖子。


无法访问Shaun的网站;感谢您对修改Makefile的注意。
保罗·内森

具体来说,您可以添加force_color = TRUE;。没有分号,则会出现编译错误。
tgrosinger 2013年

1
我刚刚建立了1.7版,而不是setLocale它的setlocale。因此tree.c,在寻找setlocale(LC_TYPE,""); 谢谢!
阿维·科恩

好答案。您可以添加有关如何将其移动到/bin(或某个路径以便可以在全球使用)的注释吗?
庆阮2014年

仅供参考,在优胜美地下编译1.7.0,我得到了:warning: format specifies type 'long' but the argument has type 'long long'。解决方法是将格式说明符从更改%9ld%9lld
David Moles


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,这是一个快速的解决方案...
Ahmed Masud

您可能想要引用变量。
slhck

$ x应该是$ dirlist不应该被引用...因为“ $ @”的特殊扩展
Ahmed Masud

1
@JenS。当然,您只需更改find​​命令即可处理该问题
Ahmed Masud 2014年

5

使用find和的替代方法awk

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


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$

为了克服这个问题,只需编辑Makefileprefix = /usr/local


好吧,这在技术上是可行的。但这是侵入性的。因此,您可能可以./configure --prefix=/usr/local在运行之前运行makemake install并且它将获得相同的结果。
JakeGould '16

2
@JakeGould绝对,我确实prefix在这种情况下使用。但是configure,最新版本的tree(1.7.0)中没有文件。在INSTALL解压缩目录的文件只是说使用makemake install通俗易懂。
vikas027

2

我将以下内容添加到〜/ .bash_profile中,以便在Terminal.app中使用。其中包含一些注释以帮助记住如何使用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

这是一个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
非常感谢您的轻量级解决方案!在OSX 10.9.5(运行中的Ruby 2.0.0)上,由于“没有将true隐式转换为String(TypeError)”错误,我不得不将#tree方法的第六行更改为read file = File.basename (path)+(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. 安装自制软件
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. 安装树
brew install tree

1
在2011年和2016年的前两个答案中已经提到过。我们是否需要第三个答案也一样?
杰森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 .profile或刷新配置文件:source .bash_profile

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.