Вопрос или проблема
Существует ли эквивалент команды 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
Подход с установкой из исходников
-
Установите инструменты командной строки Xcode, запустив
xcode-select --install
. -
Измените 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
.
Это не совсем то же самое, но быстрый способ на 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
-
Установите Xcode
-
Получите Command Line Tools
xcode-select --install
- Установите Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- Установите 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
из исходных кодов:
- Установить инструменты командной строки для Xcode:
xcode-select --install
- Скачать исходные коды
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/
- Отредактировать Makefile, чтобы включить настройки для macOS:
# Uncomment for OS X:
CC=cc
CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp
LDFLAGS=
XOBJS=strverscmp.o
- Скомпилировать и установить:
make
sudo mkdir -p /usr/local/bin
sudo cp tree /usr/local/bin/tree
- Обновить PATH в
~/.bash_profile
:
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
Теперь команда tree
будет доступна для использования.
Заключение
На Mac OS существует несколько подходов для использования функциональности команды tree
, начиная от скриптов и заканчивая установкой через менеджеры пакетов. Это требует от пользователя некоторых усилий для установки, но открывает доступ к удобному средству визуализации структуры файлов. Независимо от метода установки, tree
остается мощным инструментом для управления и навигации по файловой системе в любой Unix-подобной ОС, включая Mac OS. Главное — выбрать наиболее подходящий способ в зависимости от доступа и корпоративной политики, и тогда работа с файлами станет значительно проще и эффективнее.