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


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


265
2017-11-21 10:38


происхождения




ответы:


Да, есть, и это называется tree,

Вы можете установить его

  • от источника или
  • с менеджером пакетов

Первое может показаться немного сложным, если раньше вы не компилировали исходный код. Это требует редактирования нескольких файлов. У последнего немного накладных расходов (потому что вам может не понадобиться менеджер пакетов только для одного инструмента), но, как правило, гораздо проще установить tree и другие пакеты программного обеспечения.


Установка из источника

Во-первых, вы должны установить инструменты командной строки Xcode, выполнив xcode-select --install,

Затем, скачать tree источник, затем измените Makefile, чтобы заставить его работать, что также объясняется в Ответ @ apuche ниже, Комментировать параметры Linux и раскомментировать параметры OS X должно быть достаточно.

Затем запустите ./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,


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

Для OS X существует несколько менеджеров пакетов. Наиболее популярными являются: Homebrew, MacPorts, или доносчик (отсортировано в порядке, который я бы рекомендовал). Установите один из них - просто установите один, не все.

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

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

brew install tree

Для MacPorts:

sudo port install tree

Для Fink:

fink install tree

Менеджеры пакетов предлагают другие программы командной строки, включая GNU / Linux, которые по умолчанию не входят в OS X.


371
2017-11-21 10:52



@slhck: Спасибо! Установка Homebrew + brew install tree работал как шарм :) - Misha Moroshko
@DavidMoles Потому что просто работает make на OS X не работает. Во-первых, вы должны знать, как установить инструменты командной строки Xcode (или, как правило, иметь представление о создании программного обеспечения), а затем вы обнаружите, что это ошибка на неопределенном символе. Поэтому вам нужно внести некоторые изменения в make-файл (как объяснено Вот). Слишком много хлопот ИМО. - slhck
@ 7stud Многие люди знают несколько инструментов командной строки для очень простых задач CLI, и они могут не знать, как скомпилировать программное обеспечение. Люди иногда пытаются понять, что ./configure а также make точно и почему они нужны в первую очередь. Или они не хотят иметь дело с этим. Или прочитайте любые файлы справки, если на то пошло. Они предпочли бы сделать что-то вроде apt-get install, Это нормально, если вы предпочитаете установки из источника (и я лично тоже), но вы должны признать, что есть решения, которые легче воспринимаются другими или, возможно, даже большинством обычных пользователей компьютеров. - slhck
Люди иногда пытаются понять, что ./configure и сделать именно так, и почему они нужны в первую очередь  Я устанавливаю программное обеспечение из источника в течение 15 лет, и я понятия не имею, что ./configure а также make делать. Я просто знаю, что мне нужно выполнить шаги для установки программного обеспечения. Я слепо прочитал файлы README и INSTALL, и я делаю все, что он говорит. - 7stud
@DhruvGhulati Не то, что я знаю, но вы можете обратитьgrep Это. подобно tree | grep -v 'json' или похожие. - slhck


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

find .

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


25
2018-05-02 13:31



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


Не существует формального 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 

18
2017-11-21 10:53



Он пропускает все варианты tree, но все же хорошее небольшое решение. - slhck
@slhck хе-хе это было быстрое решение взлома ... - Ahmed Masud
Возможно, вы захотите процитировать свои переменные. - slhck
@JenS. конечно, вы можете просто изменить команду find, чтобы справиться с этим - Ahmed Masud
гений - любите его. - xaphod


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

brew install tree

18
2018-06-30 16:30



Я собирался ответить на это. Хорошее шоу. - alfonso
Простое, но мощное предложение. Благодарю. - Gearon


Или если ваш администратор не позволит вам установить какой-либо из 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.

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


16
2017-07-14 23:09



Не удалось попасть на сайт Шона; спасибо за хедз-ап по модификации Makefile. - Paul Nathan
В частности, вы можете добавить force_color = TRUE;, Нет точки с запятой, и вы получаете ошибку компиляции. - tgrosinger
Я только что построил версию 1.7 и вместо setLocale его setlocale, Итак, в tree.c, вы ищете setlocale(LC_TYPE,""); и спасибо! - Avi Cohen
Отличный ответ. Можете ли вы добавить примечание о том, как переместить его на /bin (или какой-то путь, чтобы он мог использоваться глобально)? - Khanh Nguyen
FYI, компилируя 1.7.0 под Yosemite, я получил: warning: format specifies type 'long' but the argument has type 'long long', Исправление заключалось в том, чтобы изменить спецификатор формата из %9ld в %9lld, - David Moles


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

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

5
2018-04-07 12:10





Добавление небольшой точки к Ответ @ 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


3
2018-01-12 03:16



Ну, это технически работает. Но это инвазивно. Таким образом, вы могли бы запустить ./configure --prefix=/usr/local перед запуском make а также make install и он достигнет тех же результатов. - JakeGould
@JakeGould Абсолютно, я использую prefix в таких сценариях. Но нет configure файл в последней версии дерево (1.7.0). INSTALL файл в распакованном каталоге просто говорит, что нужно использовать make а также make install сразу. - vikas027


Я добавил следующее в ~ / .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
2018-06-05 02:20





Вот решение скрипта 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
2017-11-27 19:19



Большое спасибо за легкое решение! В OSX 10.9.5 (работающий ресурс Ruby 2.0.0) из-за «неявного преобразования истины в ошибку String (TypeError)» мне пришлось изменить шестую строку метода #tree для чтения файла = File.basename (путь) + (File.directory?(path)? '/': '') - joel.neely


Я нашел здесь простое решение: 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
2017-10-09 07:34