2011-11-21 10:38:01 +0000 2011-11-21 10:38:01 +0000
330
330

Mac OS X : équivalent de la commande Ubuntu "tree"

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

回答 (13)

460
460
460
2011-11-21 10:52:07 +0000

Vous pouvez aussi 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 de ces logiciels en même temps !

Suivez les instructions sur le site web, puis exécutez l'une des commandes suivantes, selon le gestionnaire de paquets que vous avez choisi. Les gestionnaires de paquets proposent d'autres programmes en ligne de commande, y compris ceux de GNU/Linux qui ne sont pas fournis avec MacOS par défaut. Installation à partir des sources

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

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

Ensuite, lancez ./configure, puis make.

Maintenant, vous devez déplacer le fichier binaire tree vers un emplacement qui se trouve dans votre chemin d'accès à l'exécutable. Par exemple :

brew install tree

Maintenant, modifiez votre ~/.bash_profile pour inclure :

sudo port install tree

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

36
36
36
2014-05-02 13:31:59 +0000

Pas exactement la même chose, mais un moyen rapide de se rendre sur le Mac est :

find .

et c'est tout. Il s'agit d'une liste de tous les chemins d'accès aux fichiers dans le répertoire courant.

22
22
22
2012-07-14 23:09:46 +0000

Ou si votre administrateur ne vous laisse pas installer un des outils brew, fink, port vous pouvez toujours le construire à partir des sources :

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

Modifier 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 : Forcer la colorisation de la sortie

Et pendant que vous y êtes, si vous voulez forcer l'arbre à 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 post original sur son blog.

21
21
21
2016-06-30 16:30:36 +0000

Vous devriez probablement utiliser homebrew . Si vous le faites :

brew install tree
18
18
18
2011-11-21 10:53:07 +0000

Il n'y a pas de commande formelle tree en soi 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

Changez les permissions pour pouvoir 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
6
6
6
2012-04-07 12:10:48 +0000

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='/'
4
4
4
2016-10-09 07:34:10 +0000

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

Donc, en ajoutant la commande suivante à votre .bashrc, .bash_profile ou à tout autre endroit, cela fonctionnera :

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

Maintenant, l'ajout d'une commande tree s'imprimera comme ceci :

# ~/my-html-app [13:03:45]$ tree
.
| ____ app.js
| ____ css
| | ____ main.css
| | ____ theme.css
| ____ index.html
3
3
3
2016-01-12 03:16:16 +0000

Adding a small point to [ @apuche’s answer ]&3 for OSX El Capitan [ rootless ]&3 feature. make install fails since we are not allowed to write into /usr/bin directory.

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$

To overcome this, just edit Makefile to have prefix = /usr/local

2
2
2
2014-11-27 19:19:26 +0000

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 pourriez modifier la ligne meta = … pour extraire différentes métadonnées à afficher, en sélectionnant à la main les morceaux de 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 belle dans le terminal OS X que la police de caractères sur le débordement de pile) :

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
2
2
2014-06-05 02:20:04 +0000

J'ai ajouté ce qui suit au ~/.bash_profil pour l'utiliser dans Terminal.app. Quelques commentaires sont inclus pour aider à se souvenir de la manière dont la recherche est utilisée.

##########
## 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 actuel

$> tree

exemple pour un certain chemin d'accès

$> tree /some/path
1
1
1
2012-06-08 07:30:13 +0000

Ce n'est pas aussi joli que le gnoutier… mais il est très facile de se faire passer pour un autre… Vous pouvez même ajouter un peu de couleur en collant l'option G sur la couleur ls d'osx.

alias tree='find . -type d | ls -lARG'
1
1
1
2017-02-21 08:29:03 +0000
  1. Installer Xcode

  2. Obtenir les outils de ligne de commande

xcode-select --install
  1. Installer le Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Installer l'arbre
brew install tree
0
0
0
2017-10-16 14:50:54 +0000

En retard sur le jeu, mais j'avais la même question. En raison de restrictions sur le lieu de travail, je ne pouvais pas installer un paquet depuis la source ou via un gestionnaire de paquets tiers.

Voici mon implémentation :

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

Il suffit d'ajouter la fonction à /Users/foo/.profile ou .bash_profile, puis de rafraîchir le profil avec : source .profile ou : source .bash_profile