Mac OS X еквівалент команди "дерево" Ubuntu


Відповіді:


438

Ви також можете отримати treeкоманду на macOS. Якщо у вас є домашня мова , все, що вам потрібно зробити, це запустити:

brew install tree

Детальніше читайте далі.


З менеджером пакунків

Існує кілька менеджерів пакетів для macOS. Найпопулярніші: Homebrew , MacPorts або Fink . Ви можете встановити будь-який, але я рекомендую Homebrew. Не встановлюйте більше одного з них одночасно!

Дотримуйтесь інструкцій на веб-сайті, а потім запустіть одну з наступних команд, залежно від того, який менеджер пакунків ви вибрали.

Для домашнього:

brew install tree

Для MacPorts:

sudo port install tree

Для Fink:

fink install tree

Менеджери пакетів пропонують інші програми командного рядка, включаючи програми GNU / Linux, які за замовчуванням не постачаються з macOS.

Встановлення з джерела

По-перше, слід встановити інструменти командного рядка 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/… також, здається, має детальні інструкції, але може спричинити проблеми з llvm-gcc, що живуть під / Developer, якщо ви використовуєте Xcode 4.x; трохи повороту навколо має зробити трюк.
Ахмед Масуд

1
@DavidMoles Тому що просто працювати makeна OS X не працює. По-перше, ви повинні знати, як встановити інструменти командного рядка Xcode (або, як правило, мати уявлення про створення програмного забезпечення), а потім виявите, що він помиляється на невизначеному символі. Тому вам доведеться виконати деякі корективи в makefile (як пояснено тут ). Занадто багато клопоту ІМО.
slhck

3
@ 7stud Багато людей знають кілька інструментів командного рядка для дуже простих завдань CLI, і вони можуть не знати, як складати програмне забезпечення. Люди іноді намагаються зрозуміти, що ./configureі що makeсаме роблять, і навіщо вони потрібні в першу чергу. Або вони не хочуть з цим боротися. Або читайте будь-які файли довідки з цього питання. Вони скоріше щось роблять apt-get install. Це добре, якщо ви віддаєте перевагу інсталяції з джерела (і я теж особисто це роблю), але ви повинні прийняти, що є рішення, які сприймаються легше іншими, а можливо, і більшістю звичайних користувачів комп'ютерів.
slhck

1
Люди іноді намагаються зрозуміти, що ./ конфігурувати та робити саме так, і чому це потрібно, в першу чергу я встановлюю програмне забезпечення з джерела протягом 15 років, і я не маю уявлення, що ./configureі що makeробити. Я просто знаю, що це кроки, які мені потрібно виконати, щоб встановити програмне забезпечення. Я сліпо читаю файли README та INSTALL, і роблю все, що там написано.
листопада

1
@DhruvGhulati Не те, що я знаю, але ти можеш обернути grepце. Подобається tree | grep -v 'json'чи схоже.
slhck

33

Не зовсім те саме, але один швидкий шлях на Mac:

find .

і це все. У списку буде показано всі шляхи до файлів у поточному каталозі.


Якщо вас цікавить конкретний каталог: знайдіть ./ <dir_name>
raspacorp

Якщо цікавлять лише файли,find . -type f
Джаред Бек

2
Мені було цікаво лише пройти кілька рівнів глибше, щоб показати структуру каталогів, настільки find . -type d -maxdepth 2працюючу для мене
Метью Лок

Краще використовувати, find *якщо ви не хочете бачити приховані файли та каталоги. treeне показує приховані файли та каталоги за замовчуванням.
asmaier

findє 万金油 інструментом.
Еван Ху

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

Відредагуйте Makefile, щоб прокоментувати частину Linux та unment 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(або якийсь шлях, щоб його можна було використовувати в усьому світі)?
Хан Нгуен

FYI, складання 1.7.0 під Йосеміті я отримав: warning: format specifies type 'long' but the argument has type 'long long'. Виправлення полягало в тому, щоб змінити специфікатор формату з %9ldна %9lld.
Девід Молес


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, це було швидким рішенням для злому ...
Ахмед Масуд

Можливо, ви хочете цитувати свої змінні.
slhck

$ x має бути $ dirlist не слід цитувати ... через особливе розширення "$ @"
Ахмед Масуд

1
@JenS. звичайно, ви можете просто змінити команду find для вирішення цього питання
Ахмед Масуд

5

Альтернатива використання findі 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

Додавання невеликої точки до відповіді @ 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


Ну, це технічно працює. Але це інвазивно. Таким чином , ви, ймовірно , можете запустити ./configure --prefix=/usr/localперед запуском makeі make installі було б досягти тих же результатів.
JakeGould

2
@JakeGould Абсолютно, я використовую prefixв таких сценаріях. Але зараз немає configureфайлу в останній версії дерева (1.7.0). INSTALLФайл в розпакованої директорії просто говорить , щоб використовувати makeі рухається make installпрямо вперед.
vikas027

2

До ~ / .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

Ось сценарій Ruby script, який створює приємне дерево 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) через помилку "відсутність неявного перетворення правди в String (TypeError)" мені довелося змінити шостий рядок методу #tree, щоб прочитати файл = File.basename (шлях) + (File.directory?(path)? '/': '')
joel.neely

1

Це не так красиво, як gnu tree ... Але це псевдонім у bash дуже просто ... Ви навіть можете додати трохи кольору, торкнувшись параметра G на кольорі ls osx.

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 роках. Чи потрібна нам третя відповідь, яка говорить те саме?
Джейсон 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.