Mac OS X эквивалент команды Ubuntu «дерево»

172451
Misha Moroshko

Есть ли эквивалент в Ubuntu treeкоманды для Mac OS X?

273

13 ответов на вопрос

387
slhck

Вы также можете получить treeкоманду на macOS. Если у вас есть Homebrew, все, что вам нужно сделать, это запустить:

brew install tree 

Читайте дальше для деталей.


С менеджером пакетов

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

Следуйте инструкциям на веб-сайте, затем выполните одну из следующих команд, в зависимости от того, какой менеджер пакетов вы выбрали.

Для доморощенного:

brew install tree 

Для MacPorts:

sudo port install tree 

Для Финка:

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.

http://shaunchapmanblog.com/post/329270449/how-to-install-the-tree-command-on-mac-os-x также, похоже, содержит подробные инструкции, но может вызвать проблемы с llvm-gcc, проживающим в / Developer, если вы используете Xcode 4.x; немного возиться должен сделать свое дело. Ahmed Masud 12 лет назад 0
@slhck: Спасибо! Установка _Homebrew_ + `brew install tree` работала как шарм :) Misha Moroshko 12 лет назад 9
@MishaMoroshko Рад, что это сработало. Вы найдете много программ для Homebrew, поэтому, если вы когда-нибудь пропустите что-то, что у вас было в Ubuntu или думали, что только Linux может иметь, Homebrew должен помочь вам! slhck 12 лет назад 0
«Проблемный» как? David Moles 9 лет назад 0
@DavidMoles, потому что просто запустить `make` в OS X не работает. Во-первых, вы должны знать, как установить инструменты командной строки Xcode (или вообще иметь представление о сборке программного обеспечения), а затем вы обнаружите, что оно выдает ошибку на неопределенном символе. Поэтому вы должны внести некоторые изменения в make-файл (как объяснено [здесь] (http://andre-als.blogspot.de/2012/02/how-to-install-command-tree-for-mac.html)) , Слишком много хлопот ИМО. slhck 9 лет назад 1
+1 для уточнения. :) (Редактирование Makefile также задокументировано в [этом ответе] (http://superuser.com/a/448969/100451) ниже, кстати.) David Moles 9 лет назад 0
1) Хорошо, вам нужно установить инструменты командной строки Xcode, чтобы скомпилировать программы, которые вы хотите установить, из исходного кода на OS X, но, поскольку все обсуждение касается инструмента командной строки, а именно `дерева`, я бы предположил что большинство людей уже сделали это, или могут сделать это очень просто. Лично я ненавижу менеджеров пакетов, поэтому я стараюсь устанавливать из исходных кодов, когда могу. Для установки инструментов командной строки Xcode не требуется больше усилий, чем для установки менеджера пакетов. Наконец, предположим, что людям нужен менеджер пакетов для установки простой маленькой программы вроде ... 7stud 9 лет назад 0
«дерево» излишне. 2) В Yosemite 10.10.2 make не выдает ошибку - он выдает предупреждение, которое я только что проигнорировал, и команда tree установлена ​​отлично. Но исходный код может быть легко изменен, чтобы избавиться от предупреждения. Смотрите комментарии в другом ответе. 3) Когда вы загружаете все, что хотите установить, первым шагом является чтение файла README, а затем файла INSTALL. Файл INSTALL для `tree` просит вас раскомментировать определенные строки в Makefile в зависимости от того, какую ОС вы используете. Кто-то приложил много усилий, чтобы сделать это чрезвычайно легко. Это конечно не проблематично. 7stud 9 лет назад 0
@ 7stud Многие люди знают несколько инструментов командной строки для очень простых задач CLI, и они могут * не * знать, как компилировать программное обеспечение. Иногда людям трудно понять, что именно делают «. / Configure» и «make», и зачем они вообще нужны. Или они не хотят иметь дело с этим. Или прочитайте любые файлы справки, в этом отношении. Они бы предпочли сделать что-то вроде `apt-get install`. Хорошо, если вы предпочитаете установку из источника (и я лично это делаю), но вы должны признать, что есть решения, которые воспринимаются другими проще, или, возможно, даже большинством обычных пользователей компьютеров. slhck 9 лет назад 3
@ 7stud Я исправил свой ответ, добавив больше информации для обоих способов установки `tree`. slhck 9 лет назад 0
* Люди иногда пытаются понять, что ./configure и заставляют делать именно то, что нужно, и зачем они вообще нужны * Я занимаюсь установкой программного обеспечения из исходного кода в течение 15 лет, и я понятия не имею, что `. / Configure` и` make делай Я просто знаю, что это шаги, которые мне нужно выполнить для установки программного обеспечения. Я слепо читаю файлы README и INSTALL и делаю все, что они говорят. 7stud 9 лет назад 1
Это сработало, но мне также пришлось сделать [это] (http://stackoverflow.com/a/26647594/2736496), чтобы ссылка вступила в силу. aliteralmind 8 лет назад 0
Можете ли вы заставить команду `tree` игнорировать определенные типы файлов, например` * .json`? Dhruv Ghulati 8 лет назад 0
@DhruvGhulati Не то чтобы я знал об этом, но вы могли бы сделать обратное. Нравится `дерево | grep -v 'json'` или аналогичный. slhck 8 лет назад 1
@DhruvGhulati `tree --help` перечислит все параметры, один из которых -` -P pattern`, в котором перечислены только те файлы, которые соответствуют шаблону, а другой - `-I pattern`, который _omits_ файлы, которые соответствуют шаблону , Так что `tree -I '* .json'` должен делать то, что вы хотите. (Кстати: я не знаю, каков синтаксис шаблона, но я обнаружил, что этот работает: не опускайте одинарные кавычки.) Steve Powell 7 лет назад 0
27
太極者無極而生

Не совсем то же самое, но один быстрый способ на Mac:

find . 

и это все. Он перечислит все пути к файлам в текущем каталоге в виде списка.

Если интересует конкретный каталог: найди ./ raspacorp 8 лет назад 0
Если заинтересованы только в файлах, `найти. -тип f` Jared Beck 7 лет назад 0
Мне было интересно пройти несколько уровней, чтобы показать структуру каталогов, поэтому найдите. -тип d -maxdepth 2` работал на меня Matthew Lock 7 лет назад 0
Лучше использовать `find *`, если вы не хотите видеть скрытые файлы и каталоги. `tree` не показывает скрытые файлы и каталоги по умолчанию. asmaier 6 лет назад 0
19
nichochar

Вы, вероятно, должны использовать доморощенный . Если вы делаете:

brew install tree 
Я собирался ответить с этим. Хорошее шоу. alfonso 8 лет назад 0
Простое, но мощное предложение. Благодарю. Gearon 7 лет назад 0
18
Ahmed Masud

Не существует формальной 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 12 лет назад 0
@ slhck хе-хе, это было быстрое решение взлома ... Ahmed Masud 12 лет назад 0
Возможно, вы захотите процитировать ваши переменные, хотя. slhck 12 лет назад 0
$ x должен быть $ dirlist не должен заключаться в кавычки ... из-за специального расширения "$ @" Ahmed Masud 12 лет назад 0
@AhmedMasud Я ссылался на это здесь: http://superuser.com/questions/532156/how-do-i-print-a-tree-with-files-in-bash-for-windows#comment643537_532156, если вы ответите там, я дам вам помеченный ответ jcollum 11 лет назад 0
Есть идеи, как раскрасить каталоги другим цветом? Или повторно использовать цвета каталога? Jen S. 10 лет назад 0
@JenS. конечно, вы можете просто изменить команду поиска, чтобы справиться с этим Ahmed Masud 10 лет назад 1
гений - люби это. xaphod 9 лет назад 1
16
apouche

Или, если администратор не позволит вам установить любой из 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и вы закончили сборку treeдля Mac.

Дань идет к Шону Чепмену за его оригинальный пост в своем блоге.

Не удалось попасть на сайт Шона; спасибо за советы по изменению Makefile. Paul Nathan 12 лет назад 0
В частности, вы можете добавить `force_color = TRUE;`. Нет точки с запятой, и вы получите ошибку компиляции. tgrosinger 11 лет назад 0
Я только что собрал версию 1.7 и вместо `setLocale` ее` setlocale`. Итак, в `tree.c` вы ищете` setlocale (LC_TYPE, "") `; и спасибо! Avi Cohen 10 лет назад 1
Отличный ответ. Можете ли вы добавить примечание о том, как переместить его в `/ bin` (или какой-нибудь путь, чтобы его можно было использовать глобально)? Khanh Nguyen 10 лет назад 0
К вашему сведению, компилируя 1.7.0 под Yosemite, я получил: `warning: format указывает тип 'long', но аргумент имеет тип 'long long'`. Исправление состояло в том, чтобы изменить спецификатор формата с «% 9ld» на «% 9lld». David Moles 9 лет назад 0
@KhanhNguyen - Лично я помещаю подобные вещи в `~ / bin`, и в моем` ~ / .bash_profile` есть строка `export PATH = ~ / bin: $ PATH`. David Moles 9 лет назад 0
@DavidMoles, то же самое предупреждение здесь. Я проигнорировал это, и `sudo make install`, похоже, работал. Тем не менее, для записанного, где этот спецификатор формата? Это не в Makefile. Ах, я нашел это в `tree.c`. 7stud 9 лет назад 0
Это не `setLocale`, это` setlocale () `, поэтому вам нужно будет найти правильный термин. Установка из исходного кода это путь. Файл `Install` сообщает вам, какие строки нужно раскомментировать в Makefile, в зависимости от вашей ОС, поэтому он не может быть более легким (вам не нужно комментировать опции Linux). Однако в этом ответе слишком много ошибок. Раскрашивание кажется мне случайным, поэтому я бы просто пропустил его. 7stud 9 лет назад 0
5
jweyrich

Альтернативное использование findи awk:

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

Adding a small point to @apuche's answer for OSX El Capitan rootless feature. make install fails since we are not allowed to write into /usr/bin directory.

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$ 

To overcome this, just edit Makefile to have prefix = /usr/local

Ну, это технически работает. Но это агрессивно. Поэтому вы, вероятно, могли бы запустить `./configure --prefix = / usr / local` перед запуском` make` и `make install`, и это дало бы те же результаты. JakeGould 8 лет назад 0
@JakeGould Безусловно, я использую префикс в таких сценариях. Но в последней версии [tree] (http://mama.indstate.edu/users/ice/tree/) (1.7.0) нет файла `configure`. Файл `INSTALL` в разархивированном каталоге просто говорит, что нужно использовать` make` и `make install` сразу. vikas027 8 лет назад 1
3
Shashank Agrawal

Я нашел простое решение здесь: 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
l --marc l

I added the following to ~/.bash_profile for use in Terminal.app. Some comments are included to help remember how find is being used.

########## ## 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 $ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' } 

example for the current directory

$> tree 

example for some path

$> tree /some/path 
2
Phrogz

Вот сценарий 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 "#"`.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/]}#s" }.join(' ') cols.map{ |a| a.length==1 ? a.first : tmpl % a } end puts tree(ARGV.first || ".") if __FILE__==$0 

Вы можете изменить meta = …строку, чтобы извлечь различные метаданные для отображения, выбирая вручную разделенные фрагменты на следующей строке. Еще немного поработав, вы можете передать произвольные аргументы ls, чтобы выбрать метаданные для отображения.

Пример вывода (выглядит лучше в терминале 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 
Большое спасибо за легкое решение! В OSX 10.9.5 (работает на Ruby 2.0.0) из-за ошибки «нет неявного преобразования true в String (TypeError)» мне пришлось изменить шестую строку метода #tree на чтение file = File.basename (путь) + (File.directory?(path)? '/': '') joel.neely 8 лет назад 2