web-dev-qa-db-fra.com

Equivalent Mac OS X de la commande "tree" d'Ubuntu

Existe-t-il un équivalent de la commande Ubuntu tree pour Mac OS X?

302
Misha Moroshko

Vous pouvez également obtenir la commande tree sur macOS. Si vous avez Homebrew , tout ce que vous avez à faire est de lancer:

brew install tree

Lisez la suite pour plus de détails.


Avec un gestionnaire de paquets

Il existe plusieurs gestionnaires de paquets pour macOS. Les plus populaires sont: Homebrew , MacPorts , ou Fink . Vous pouvez installer l'un ou l'autre, mais je recommande Homebrew. N'installez pas plus d'un d'entre eux en même temps!

Suivez les instructions du site Web, puis exécutez l’une des commandes suivantes, en fonction du gestionnaire de packages que vous avez choisi.

Pour Homebrew:

brew install tree

Pour MacPorts:

Sudo port install tree

Pour Fink:

fink install tree

Les gestionnaires de paquets offrent d'autres programmes en ligne de commande, y compris ceux GNU/Linux qui ne sont pas fournis avec macOS par défaut.

Installation à partir de la source

Tout d'abord, vous devez installer les outils de ligne de commande Xcode en exécutant xcode-select --install.

Ensuite, téléchargez la source tree . Puis changez le Makefile pour le faire fonctionner , ce qui est également expliqué dans la réponse de @ apuche ci-dessous . Commenter les options Linux et les commenter macOS devrait suffire.

Ensuite, exécutez ./configure, puis make.

Vous devez maintenant déplacer le fichier binaire tree vers un emplacement situé dans votre chemin d’exécutable. Par exemple:

Sudo mkdir -p /usr/local/bin
Sudo cp tree /usr/local/bin/tree

Maintenant, éditez votre ~/.bash_profile pour inclure:

export PATH="/usr/local/bin:$PATH"

Rechargez le shell, et maintenant which tree devrait pointer sur /usr/local/bin/tree.

422
slhck

Ce n'est pas exactement pareil, mais un moyen rapide sur Mac est:

find .

et c'est tout. Il listera tous les chemins de fichiers du répertoire en cours.

31

Vous devriez probablement utiliser homebrew . Si tu fais:

brew install tree
21
nichochar

Ou bien, si votre administrateur ne vous laisse pas installer l’un des outils brew, fink, port, vous pouvez toujours le construire à partir de la source:

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

Editez le Makefile pour commenter la partie linux et décommenter la zone 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

Facultatif: Forçage de la sortie couleur

Et pendant que vous y êtes, si vous voulez forcer tree à toujours coloriser la sortie, vous pouvez toujours éditer la méthode main du fichier tree.c et ajouter force_color=TRUE; avant setLocale(LC_TYPE,"");.

Enfin, appuyez sur make et vous avez fini de construire tree pour mac.

Hommage va à Shaun Chapman pour son article original sur son blog.

21
apouche

Il n’existe pas de commande tree formelle, mais vous pouvez le faire:

Enregistrez le script suivant dans/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

Modifiez les autorisations afin que vous puissiez l'exécuter:

chmod 755 /usr/local/bin/tree 

Bien sûr, vous devrez peut-être créer /usr/local/bin:

Sudo mkdir -p /usr/local/bin/tree 
18
Ahmed Masud

Une alternative utilisant find et awk:

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

J'ai trouvé une solution simple ici: http://murphymac.com/tree-command-for-mac/

Donc, ajouter ce qui suit à votre .bashrc, .bash_profile ou à tout autre endroit le fera fonctionner:

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

Maintenant, ajouter une commande tree affichera ceci:

# ~/my-html-app [13:03:45]$ tree
.
|____app.js
|____css
| |____main.css
| |____theme.css
|____index.html
3
Shashank Agrawal

Ajouter un petit point à la réponse de @ apuche pour OSX El Capitan rootless feature. make install échoue car nous ne sommes pas autorisés à écrire dans le répertoire /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$

Pour surmonter cela, éditez simplement Makefile pour avoir prefix = /usr/local

3
vikas027

J'ai ajouté ce qui suit à ~/.bash_profile pour une utilisation dans Terminal.app. Certains commentaires sont inclus pour vous aider à vous rappeler comment trouver est utilisé.

##########
## 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'
}

exemple pour le répertoire en cours

$> tree

exemple pour un chemin

$> tree /some/path
2
l --marc l

Voici une solution de script Ruby qui produit un bel arbre Unicode avec des métadonnées utiles.

#!/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

Vous pouvez modifier la ligne meta = … pour extraire différentes métadonnées à afficher, en sélectionnant à la main les pièces scindées sur la ligne suivante. Avec un peu plus de travail, vous pourriez passer des arguments ls arbitraires pour sélectionner les métadonnées à afficher.

Exemple de sortie (plus esthétique dans le terminal OS X que dans la police de 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
Phrogz

Ce n'est pas aussi joli que gnu tree ... mais c'est vraiment facile de faire un alias dans bash ... Vous pouvez même ajouter un peu de couleur en ajoutant l'option G à la couleur de ls d'osx.

alias tree='find . -type d | ls -lARG'
1
Eddie B

Tard au jeu, mais j'avais la même question. En raison de restrictions sur le lieu de travail, je ne pouvais pas installer un package à partir des sources ni via un gestionnaire de package tiers.

Ceci est ma mise en œuvre:

# 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'
}

Ajoutez simplement la fonction à /Users/foo/.profile ou .bash_profile, puis actualisez le profil avec: source .profile ou: source .bash_profile

0
marshki
  1. Installer Xcode

  2. Obtenir des outils de ligne de commande

xcode-select --install
  1. Installer Homebrew
Ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Installer l'arborescence
brew install tree
0
KunMing Xie