Ubuntu“tree”명령과 동등한 Mac OS X


답변:


428

treemacOS에서도 명령을 얻을 수 있습니다 . Homebrew 가있는 경우 다음을 실행하면됩니다.

brew install tree

자세한 내용은 계속 읽으십시오.


패키지 관리자

macOS 용 패키지 관리자가 몇 가지 있습니다. 가장 인기있는 것은 Homebrew , MacPorts 또는 Fink 입니다. 둘 중 하나를 설치할 수 있지만 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"

쉘을 다시로드하면 이제 which tree를 가리켜 야합니다 /usr/local/bin/tree.


shaunchapmanblog.com/post/329270449/… 또한 자세한 지침이있는 것 같지만 Xcode 4.x를 실행하는 경우 / Developer에서 llvm-gcc에 문제가 발생할 수 있습니다. 약간의 장난은 트릭을해야합니다.
Ahmed Masud

1
@DavidMoles 단순히 makeOS X에서 실행 이되지 않기 때문입니다. 먼저 Xcode 명령 줄 도구를 설치하는 방법을 알고 있어야합니다 (또는 일반적으로 소프트웨어 빌드에 대한 아이디어가 있어야합니다). 그러면 정의되지 않은 기호에서 오류가 발생한다는 것을 알게 될 것입니다. 따라서 makefile을 약간 조정해야합니다 ( 여기에 설명되어 있음 ). 번거로운 IMO가 너무 많습니다.
slhck

3
@ 많은 사람들이 매우 간단 CLI 작업에 대한 몇 가지 명령 줄 도구를 알고 7stud, 그들은 수 없는 소프트웨어를 컴파일하는 방법을 알고있다. 사람들은 때때로 무엇을 ./configure하고 make정확하게 무엇을해야하는지 , 왜 처음에 그들이 필요한지 를 이해하려고 노력합니다 . 또는 그들은 그것을 다루고 싶지 않습니다. 또는 해당 문제에 대한 도움말 파일을 읽으십시오. 그들은 오히려 같은 것을하고 싶습니다 apt-get install. 소스에서 설치하는 것을 선호한다면 괜찮습니다 (개인적으로도 마찬가지입니다).하지만 다른 사람들, 또는 대부분의 일반 컴퓨터 사용자가 더 쉽게 인식하는 솔루션이 있다는 것을 인정해야합니다.
slhck

1
사람들은 때때로 어떤 ./configure를 이해하기 위해 투쟁하고 정확하게 할 수 있도록 그이 처음에 왜 필요한지 나는 15 년 동안 소스에서 소프트웨어를 설치 봤는데, 내가 무슨 생각이 없다 ./configure하고 make수행하십시오. 소프트웨어를 설치하기 위해 수행해야 할 단계라는 것을 알고 있습니다. 나는 README와 INSTALL 파일을 맹목적으로 읽었으며 그 내용에 상관없이 모든 작업을 수행합니다.
7stud

1
@DhruvGhulati 내가 아는 바는 없지만 그 반대 일 수도 grep있습니다. 같은 tree | grep -v 'json'또는 유사한.
slhck

32

정확히 동일하지는 않지만 Mac에서 빠른 방법은 다음과 같습니다.

find .

그리고 그게 다야. 현재 디렉토리의 모든 파일 경로를 목록으로 나열합니다.


특정 디렉토리에 관심이 있다면 : find ./ <dir_name>
raspacorp

파일에만 관심이 있다면find . -type f
Jared Beck

1
그래서 디렉토리 구조 보여 깊은 몇 수준가는에만 관심이 있었다 find . -type d -maxdepth 2나를 위해 일한
마태 잠금

find *숨겨진 파일과 디렉토리를 보지 않으려면 더 잘 사용 하십시오. tree숨겨진 파일 및 디렉토리는 기본적으로 표시되지 않습니다.
asmaier

find万金油 도구입니다.
Evan Hu

22

또는 관리자는 당신이 중 하나를 설치하지 않을 경우 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

리눅스 부분을 주석 처리하고 osx 영역의 주석을 해제하려면 Makefile을 편집하십시오 :

# 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하면 treeMac 용 빌드가 완료됩니다 .

공물은 자신의 블로그에 자신의 원래 게시물을 위해 숀 채프먼 에게 간다 .


Shaun의 웹 사이트에 접속할 수 없습니다. Makefile을 수정하는 데 감사드립니다.
Paul Nathan

구체적으로을 추가 할 수 있습니다 force_color = TRUE;. 세미콜론이없고 컴파일 오류가 발생합니다.
tgrosinger

1
방금 버전 1.7 대신 빌드 setLocale했습니다 setlocale. 그래서에서 tree.c, 당신은 찾는다 setlocale(LC_TYPE,""); 그리고 감사합니다!
Avi Cohen

좋은 대답입니다. 이동 방법 /bin(또는 전 세계적으로 사용할 수있는 경로) 에 대한 메모를 추가 할 수 있습니까 ?
Khanh Nguyen

참고로 요세미티에서 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. 물론 찾기 명령을 변경하여 간단히 처리 할 수 ​​있습니다
Ahmed Masud

5

findand를 사용하는 대안 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$

이 문제를 극복하기 위해, 그냥 편집 Makefile해야 할prefix = /usr/local


글쎄, 이것은 기술적으로 작동합니다. 그러나 침략적입니다. 그래서 당신은 아마 실행할 수 있습니다 ./configure --prefix=/usr/local실행하기 전에 make그리고 make install그것은 동일한 결과를 얻을 것입니다.
JakeGould

2
@JakeGould 물론, 나는 prefix그러한 시나리오에서 사용 합니다. 그러나 현재 configure최신 버전의 트리 (1.7.0) 에는 파일 이 없습니다 . INSTALL압축을 푼 디렉토리에있는 파일은 사용할 말했다 makemake install직선.
vikas027

3

간단한 해결책을 찾았습니다 : 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

Terminal.app에서 사용하기 위해 ~ / .bash_profile에 다음을 추가했습니다. 찾기 사용 방법을 기억하는 데 도움이되는 일부 주석이 포함되어 있습니다.

##########
## 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 스크립트 솔루션입니다.

#!/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 인수를 전달하여 표시 할 메타 데이터를 선택할 수 있습니다.

샘플 출력 (Stack Overflow의 글꼴보다 OS X 터미널에서 더 좋아 보입니다) :

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 실행)에서 '참으로 문자열을 암시 적으로 변환하지 않음 (TypeError)'오류로 인해 #tree 메소드의 여섯 번째 행을 변경하여 file = File.basename을 읽었습니다. (경로) + (파일 디렉토리? (경로)? '/': '')
joel.neely

1

gnu tree만큼 예쁘지는 않지만 ... bash에서 별명을 지정하는 것은 정말 쉽습니다 ... G 옵션을 osx의 ls 색상으로 선택하여 약간의 색상을 추가 할 수도 있습니다.

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 년의 두 가지 이전 답변에서 이미 언급했습니다. 같은 말을하는 세 번째 답변이 필요합니까?
Jason 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.