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


Ответы:


438

Вы также можете получить 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.


shaunchapmanblog.com/post/329270449/… также, кажется, содержит подробные инструкции, но может вызвать проблемы с llvm-gcc, живущим в / Developer, если вы работаете с Xcode 4.x; немного возиться должен сделать свое дело.
Ахмед Масуд

1
@DavidMoles, потому что просто запуск makeна OS X не работает. Во-первых, вы должны знать, как установить инструменты командной строки Xcode (или вообще иметь представление о сборке программного обеспечения), а затем вы обнаружите, что оно выдает ошибку на неопределенном символе. Поэтому вы должны внести некоторые изменения в make-файл (как описано здесь ). Слишком много хлопот ИМО.
Slhck

3
@ 7stud Многие люди знают несколько инструментов командной строки для очень простых задач CLI, и они могут не знать, как компилировать программное обеспечение. Люди иногда трудно понять , что ./configureи makeименно делать и почему те , необходимы в первую очередь. Или они не хотят иметь дело с этим. Или прочитайте любые файлы справки, в этом отношении. Они бы предпочли сделать что-то подобное apt-get install. Хорошо, если вы предпочитаете установку из источника (и я лично это делаю), но вы должны признать, что есть решения, которые легче воспринимаются другими или, возможно, даже большинством обычных пользователей компьютеров.
slhck

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

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

Возможно, вы захотите процитировать ваши переменные, хотя.
slhck

$ x должен быть $ dirlist не должен быть заключен в кавычки ... из-за специального расширения "$ @"
Ахмед Масуд

1
@JenS. конечно, вы можете просто изменить команду поиска, чтобы справиться с этим
Ахмед Масуд

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

##########
## 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, который создает красивое дерево 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, чем шрифт в переполнении стека):

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

1

Это не так красиво, как дерево gnu ... но в 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 годах. Нужен ли третий ответ, говорящий так же?
Джейсон С

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.