Эквивалент команды “tree” в Ubuntu для Mac OS X

Вопрос или проблема

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

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

brew install tree

Если у вас не установлен Homebrew, попробуйте один из указанных ниже подходов.


Подход с установкой через менеджер пакетов

Следуйте инструкциям на этих сайтах, чтобы установить Homebrew, MacPorts или Fink. Не устанавливайте более одного менеджера пакетов одновременно!

Следуйте предложению выбранного менеджера.

Для Homebrew: brew install tree

Для MacPorts: sudo port install tree

Для Fink: fink install tree

Подход с установкой из исходников

  1. Установите инструменты командной строки Xcode, запустив xcode-select --install.

  2. Скачайте исходники tree

  3. Измените Makefile, чтобы он работал, также объяснено в ответе @apuche ниже. Комментарий Linux опций и раскомментирование macOS опций должно быть достаточно.

  4. Затем запустите ./configure, затем make.

  5. Теперь необходимо переместить исполняемый файл tree в каталог, который находится в вашем исполняемом пути. Например:

     sudo mkdir -p /usr/local/bin
     sudo cp tree /usr/local/bin/tree
    
  6. Теперь отредактируйте ~/.bash_profile, чтобы включить:

     export PATH="/usr/local/bin:$PATH"
    
  7. Перезагрузите оболочку, и теперь which tree должно указывать на /usr/local/bin/tree.

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

find .

и все. Это выйдет список всех путей файлов в текущем каталоге в виде списка.

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

Опция: Принудительный вывод с цветом

И пока вы заняты, если вы хотите заставить tree всегда раскрашивать вывод, вы можете отредактировать метод main в файле tree.c и добавить force_color=TRUE; перед setLocale(LC_TYPE,"");

В заключение, нажмите make, и вы завершите сборку tree для mac.

Дан хороший пост от Shaun Chapman за его оригинальную статью в блоге.

Команды 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 

Возможно, вам следует использовать homebrew. Если так, то:

brew install tree

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

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

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

Это не так красиво, как gnu tree… но это очень просто в bash… Вы даже можете добавить немного цвета, добавив опцию G к osx ls color.

alias tree="find . -type d | ls -lARG"

Вот решение на основе скрипта 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) ? "https://superuser.com/" : ''
      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

Добавлю небольшое замечание к ответу @apuche в связи с функцией rootless в OSX El Capitan rootless. 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

Установка команды broot очень интересная. Вы получите следующее:

  • Поиск в открытом каталоге во время навигации.
  • Открытие файла или документа в приложении по умолчанию. (похоже на ranger) для выхода используйте (:q)

Установка на macOSX с использованием HomeBrew

 brew install broot

вставьте описание изображения здесь

  1. Установите Xcode

  2. Получите Command Line Tools

xcode-select --install
  1. Установите Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Установите tree
brew install tree

Хотя и поздно, но у меня был такой же вопрос. Из-за ограничений на рабочем месте я не мог установить пакет из исходников или через сторонний менеджер пакетов.

Вот мое решение:

#!/usr/bin/env bash
#
# Псевдо-команда tree.
#
# Рекурсивный список каталогов/файлов в текущем рабочем каталоге (PWD), 
# с суммарным количеством каталогов и файлов.
# Аргумент: 
#   Каталог интереса, 
#     напр.: tree /Users/foo/foo_dir
# Вывод:
#   Рекурсивный список каталогов/файлов в указанном каталоге,
# 
# Аргумент:
#   Каталог интереса с пользовательским уровнем рекурсивной глубины, 
#     напр.: tree /System/Library 2  
# Вывод:
#   Рекурсивный список каталогов/файлов в указанном каталоге, останавливаясь на 
#   заданной глубине рекурсии, напр., 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

Улучшение одного из предыдущих ответов

tree() {
  dir="${1:-./}"
  [ -d "$dir" ] && find "$dir" -print | sed -e 's;[^/]*/;|____;g' -e 's;____|; |;g'
}

Ответ или решение

В мире информационных технологий существование множества различных операционных систем создает задачи поиска эквивалентов привычных утилит и команд. Команда tree, широко используемая в дистрибутивах Linux, таких как Ubuntu, для отображения структуры директорий и файлов в виде дерева, не входит в стандартный набор инструментов на Mac OS X. Однако существует несколько способов реализации аналогичной функциональности на macOS, что позволяет пользователям оставаться продуктивными и эффективно управлять своими файлами и каталогами.

Теоретическая предпосылка

Команда tree — это удобный инструмент для визуализации иерархии папок. В Linux она выводит структуру каталогов в виде древовидной схемы, предоставляя пользователям возможность легко обозревать содержимое директорий. На Mac OS X этот инструмент по умолчанию отсутствует, и пользователи вынуждены искать альтернативные решения. Сама команда tree всего лишь предоставляет текстовый интерфейс для навигации и управления файлами, являясь по сути оберткой над такими базовыми командами, как ls, find и текстовыми процессорами типа awk и sed.

Пример

Представим себе пользователя на Mac OS, который хочет быстро просмотреть иерархию своего проекта. В Ubuntu он бы просто использовал tree, но на macOS ему потребуется некоторое усилие для достижения аналогичного результата. Например, пользователь может использовать такие команды, как find с дополнениями на sed:

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

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

Как альтернатива, пользователи могут установить Homebrew — популярный менеджер пакетов для macOS — и затем просто установить tree:

brew install tree

После чего команда tree будет доступна для использования, как и в Ubuntu.

Практическое применение

Для пользователей Mac OS, которым предоставлен доступ к установке сторонних программ, Homebrew является наиболее удобным решением. Это менеджер пакетов, обеспечивающий легкую установку и поддержку широкого спектра программного обеспечения из мира UNIX. tree может быть установлен буквально за секунды, открыв пользователям всю мощь этого инструмента.

Пользователи, которые не могут использовать Homebrew из-за корпоративных ограничений, могут воспользоваться следующей инструкцией по компиляции tree из исходных кодов:

  1. Установить инструменты командной строки для Xcode:
xcode-select --install
  1. Скачать исходные коды tree:
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/
  1. Отредактировать Makefile, чтобы включить настройки для macOS:
# Uncomment for OS X:
CC=cc
CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp
LDFLAGS=
XOBJS=strverscmp.o
  1. Скомпилировать и установить:
make
sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree
  1. Обновить PATH в ~/.bash_profile:
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

Теперь команда tree будет доступна для использования.

Заключение

На Mac OS существует несколько подходов для использования функциональности команды tree, начиная от скриптов и заканчивая установкой через менеджеры пакетов. Это требует от пользователя некоторых усилий для установки, но открывает доступ к удобному средству визуализации структуры файлов. Независимо от метода установки, tree остается мощным инструментом для управления и навигации по файловой системе в любой Unix-подобной ОС, включая Mac OS. Главное — выбрать наиболее подходящий способ в зависимости от доступа и корпоративной политики, и тогда работа с файлами станет значительно проще и эффективнее.

Оцените материал
Добавить комментарий

Капча загружается...