tree
命令的内容?#1 楼
您也可以在macOS上获得tree
命令。如果您有Homebrew:brew install tree
如果没有安装Homebrew,请尝试以下一种方法。
安装软件包管理器方法
按照这些网站上的说明进行操作安装Homebrew,MacPorts或Fink。不要同时安装多个软件包管理器。
按照安装提示进行操作。
对于自制软件:
brew install tree
对于MacPorts:
sudo port install tree
对于Fink:
fink install tree
从源代码安装方法
通过运行
xcode-select --install
安装Xcode命令行工具。下载
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
。#2 楼
不完全相同,但是在Mac上,一种快速的方法是:find .
就是这样。它将列出当前目录中的所有文件路径作为列表。
评论
如果对特定目录感兴趣:查找./ <目录名称>
–raspacorp
16年7月8日在22:12
如果仅对文件感兴趣,请查找。型f
–Jared Beck
17年3月16日在17:54
我只想深入研究几个级别以显示目录结构,所以请找到。型d -maxdepth 2为我工作
–马修·洛克(Matthew Lock)
17年4月21日在7:13
如果您不想看到隐藏的文件和目录,最好使用find *。默认情况下,树不显示隐藏的文件和目录。
– asmaier
18年5月31日在14:36
这样会很好。回答每个问题“我如何在Mac上安装X?”的人大开眼界。并带有“自酿,只需说出酿造X”。我从来不明白为什么有人愿意维护一个额外的包裹管理系统并依赖某些人来包装东西,而是每个人自己包装。
– Laryx Decidua
3月26日10:01
#3 楼
或者,如果管理员不允许您安装任何brew
,fink
,port
工具,则始终可以从源代码中进行构建: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
,就可以为Mac构建tree
。致敬肖恩·查普曼(Shaun Chapman)在其博客上的原始帖子。
评论
无法访问Shaun的网站;感谢您对修改Makefile的注意。
– Paul Nathan
2012年10月26日14:27
具体来说,您可以添加force_color = TRUE;。没有分号,您会遇到编译错误。
– tgrosinger
2013年9月6日15:55
我刚刚构建了1.7版,而不是setLocale的setlocale。因此,在tree.c中,您将寻找setlocale(LC_TYPE,“”);谢谢!
–阿维·科恩(Avi Cohen)
2014年5月2日在9:49
好答案。您能否添加有关如何将其移动到/ bin(或某个路径以便可以在全局使用)的注释?
–庆阮(Khanh Nguyen)
2014年10月10日4:57
仅供参考,我在优胜美地下编译1.7.0:警告:format指定类型'long',但是参数的类型为'long long'。解决方法是将格式说明符从%9ld更改为%9lld。
– David Moles
15年1月21日在18:02
#4 楼
您可能应该使用自制软件。如果您这样做:brew install tree
#5 楼
本身没有正式的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
11年11月21日在11:01
@slhck嘿嘿,这是一个快速的破解解决方案...
–艾哈迈德·马苏德(Ahmed Masud)
11年11月21日在11:05
您可能希望引用变量。
–slhck
2011年11月21日在11:12
$ x应该是$ dirlist不应该被引用...因为“ $ @”的特殊扩展
–艾哈迈德·马苏德(Ahmed Masud)
11年11月21日在11:24
@JenS。当然,您只需更改find命令即可解决该问题
–艾哈迈德·马苏德(Ahmed Masud)
2014年9月24日20:41在
#6 楼
使用find
和awk
的替代方法:#!/bin/bash
find . -print 2>/dev/null | awk '!/\.$/ { \
for (i=1; i<NF; i++) { \
printf("%4s", "|") \
} \
print "-- "$NF \
}' FS='/'
评论
这使子目录管道与父目录的第一个字母对齐,我更喜欢在多个答案中重复执行的SED命令,该命令仅将子目录缩进两个空格,但在父目录之前给出四个下划线。我也喜欢破折号。
–Jason S
5月24日13:28
#7 楼
我在这里找到了一个简单的解决方案: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
评论
很棒的单行代码,但仅适用于当前目录
– Laryx Decidua
3月26日10:02
那你想达到什么目的呢?
– Shashank Agrawal
3月26日14:09
有时我想画另一个目录的树。就像我在主目录中一样,想要查看其中的内容,例如/ tmp。请理解,我喜欢这种单线的优雅,并且赞成您的回答,只是想指出一点,如果有人在寻找,它并不能完全替代“真正的”树命令。
– Laryx Decidua
3月26日17:04
谢谢@JasonS,但根据StackExchange网络指南,它的答案不一样。完全不同。
– Shashank Agrawal
5月25日5:57
#8 楼
这是一个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__==meta = …
您可以修改
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
行以提取不同的元数据进行显示,并在下一行中手动选择拆分的片段。要做更多的工作,您可以传递任意的ls参数以选择要显示的元数据。示例输出(在OS X终端中看起来比Stack Overflow上的字体更好):
q4312079q
评论
非常感谢您的轻量级解决方案!在OSX 10.9.5(运行中的Ruby 2.0.0)上,由于“没有将true隐式转换为String(TypeError)”错误,我不得不将#tree方法的第六行更改为read file = File.basename (路径)+(File.directory?(路径)?'/':'')
– joel.neely
16年7月16日在13:33
#9 楼
在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
评论
好吧,这在技术上是可行的。但这是侵入性的。因此,您可以在运行make和make install之前运行./configure --prefix = / usr / local,它将获得相同的结果。
–Giacomo1968
16年1月12日在3:23
@JakeGould当然,在这种情况下,我确实使用前缀。但是,最新版本的tree(1.7.0)中没有配置文件。解压缩目录中的INSTALL文件只是说要直接使用make和make install。
–vikas027
16年1月12日,下午3:29
#10 楼
它不像gnu树那么漂亮...但是在bash中使用别名确实很容易...您甚至可以通过在osx的ls颜色上添加G选项来添加一些颜色。/>
#11 楼
比赛迟到了,但是我有同样的问题。由于工作场所的限制,我无法从源代码或通过第三方软件包管理器安装软件包。这是我的实现:
# 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 "" ] && local depth="-maxdepth ";
find "${1:-.}" ${depth} -print 2> /dev/null | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
}
只需将函数添加到
/Users/foo/.profile
或.bash_profile
中,然后用以下代码刷新配置文件:
source .profile
或:source .bash_profile
#12 楼
安装Xcode
获取命令行工具
xcode-select --install
安装Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装树
brew install tree
评论
shaunchapmanblog.com/post/329270449/…似乎也有详细的说明,但是如果您运行的是Xcode 4.x,则可能会导致llvm-gcc位于/ Developer下的问题。有点摆弄应该可以解决问题。
–艾哈迈德·马苏德(Ahmed Masud)
11-11-21在11:04
@DavidMoles因为仅在OS X上运行make不起作用。首先,您必须知道如何安装Xcode命令行工具(或者通常对构建软件有一些想法),然后您会发现它在未定义的符号上出错。因此,您必须对makefile进行一些调整(如此处所述)。 IMO太麻烦了。
–slhck
2015年1月21日在22:04
@ 7stud许多人都知道一些用于非常简单的CLI任务的命令行工具,他们可能不知道如何编译软件。人们有时很难理解什么。/配置和确切地做以及为什么首先需要这些。或者他们不想处理它。或阅读任何帮助文件。他们宁愿做apt-get install之类的事情。如果您更喜欢从源代码安装(我个人也这样做),那很好,但是您必须接受其他人甚至大多数普通计算机用户都认为容易的解决方案。
–slhck
2015年4月9日下午6:56
人们有时很难理解./configure和make的功能以及为什么需要这些功能。首先,我已经从源代码安装软件15年了,而我不知道./configure和make的功能。我只知道它们是我安装软件所需执行的步骤。我盲目地阅读了README和INSTALL文件,然后按我说的去做。
– 7stud
2015年4月9日在17:08
@DhruvGhulati我不知道,但是您可以反grep它。像树grep -v'json'或类似的。
–slhck
16年8月4日在8:20