Équivalent Mac OS X de la commande «tree» d'Ubuntu

Réponses:

438

Vous pouvez également obtenir la treecommande 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 le treesource . 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.

Alors, cours ./configure, alors make.

Maintenant, vous devez déplacer le treefichier binaire 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_profilepour inclure:

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

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

slhck
la source
shaunchapmanblog.com/post/329270449/… semble également avoir des instructions détaillées mais peut causer des problèmes avec llvm-gcc vivant sous / Developer si vous utilisez Xcode 4.x; un peu de bidouillage devrait faire l'affaire.
Ahmed Masud
1
@DavidMoles Parce qu'exécuter sous makeOS X ne fonctionne pas. Tout d'abord, vous devez savoir comment installer les outils de ligne de commande Xcode (ou en général, avoir une idée de la construction de logiciels), puis vous découvrirez qu'il génère une erreur sur un symbole non défini. Vous devez donc faire quelques ajustements dans le makefile (comme expliqué ici ). Trop de tracas à l’OMI.
Slhck
3
@ 7stud De nombreuses personnes connaissent quelques outils de ligne de commande pour des tâches CLI très simples et peuvent ne pas savoir compiler les logiciels. Les gens ont parfois du mal à comprendre ce qu’ils font ./configureet makece qu’ils font exactement et pourquoi. Ou ils ne veulent pas y faire face. Ou lisez tous les fichiers d'aide, d'ailleurs. Ils préfèrent faire quelque chose comme apt-get install. C'est bien si vous préférez les installations à partir des sources (et moi aussi personnellement), mais vous devez accepter le fait qu'il existe des solutions qui sont perçues plus facilement par les autres, voire même par la majorité des utilisateurs normaux.
Slhck
1
Les gens parfois du mal à comprendre ce que ./configure et faire exactement faire et pourquoi ceux -ci sont nécessaires en premier lieu j'ai été l' installation de logiciels à partir des sources depuis 15 ans, et je ne sais pas ce que ./configureet makefaire. Je sais simplement que ce sont des étapes à suivre pour installer un logiciel. Je lis aveuglément les fichiers README et INSTALL, et je fais ce qu’il dit.
7
1
@DhruvGhulati Pas que je sache, mais vous pouvez l'inverser grep. Comme tree | grep -v 'json'ou similaire.
Slhck
33

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.

nopole
la source
Si vous êtes intéressé par un répertoire particulier: recherchez ./ <rép_nom>
raspacorp le
Si seulement intéressé par les fichiers,find . -type f
Jared Beck
2
J'étais seulement intéressé à aller quelques niveaux plus en profondeur pour montrer la structure de répertoires qui find . -type d -maxdepth 2fonctionnait si bien pour moi
Matthew Lock le
Mieux vaut l'utiliser find *si vous ne voulez pas voir les fichiers et répertoires cachés. treene montre pas les fichiers cachés et les répertoires par défaut.
Asmaier
findest un 万金油 outil.
Evan Hu
22

Ou si votre administrateur ne vous laissera pas installer l' un des brew, fink, des portoutils que vous pouvez toujours construire 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 mainméthode du tree.cfichier et ajouter force_color=TRUE;avant.setLocale(LC_TYPE,"");

Enfin cliquez sur makeet vous avez terminé la construction treepour mac.

Hommage rend hommage à Shaun Chapman pour son article original sur son blog.

Apouche
la source
Impossible d'accéder au site Web de Shaun. merci pour la tête sur la modification du Makefile.
Paul Nathan
Plus précisément, vous pouvez ajouter force_color = TRUE;. Pas de point-virgule et vous obtenez une erreur de compilation.
Tgrosinger
1
Je viens de la version 1.7 et au lieu construit de setLocaleson setlocale. Alors à l'intérieur tree.c, vous recherchez setlocale(LC_TYPE,""); et merci!
Avi Cohen
Très bonne réponse. Pouvez-vous ajouter une note sur la façon de le déplacer /bin(ou un chemin d'accès afin qu'il puisse être utilisé globalement)?
Khanh Nguyen
Pour votre information, la compilation 1.7.0 sous Yosemite je suis arrivé: warning: format specifies type 'long' but the argument has type 'long long'. Le correctif consistait à changer un spécificateur de format de %9lden %9lld.
David Moles
21

Vous devriez probablement utiliser homebrew . Si tu fais:

brew install tree
Nichochar
la source
18

Il n'y a pas de treecommande formelle en tant que telle, 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 
Ahmed Masud
la source
Il manque toutes les options de tree, mais reste une belle petite solution.
Slhck
@slhck hehe c'était une solution rapide de hack ...
Ahmed Masud
Vous voudrez peut-être cependant citer vos variables.
Slhck
$ x devrait être $ dirlist ne devrait pas être cité ... en raison de l'extension spéciale de "$ @"
Ahmed Masud
1
@JenS. bien sûr, vous pouvez simplement changer la commande de recherche pour régler ce problème
Ahmed Masud
5

Une alternative utilisant findet awk:

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

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

Ainsi , en ajoutant ce qui suit à votre .bashrc, .bash_profileou tout autre lieu fera fonctionner:

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

Maintenant, ajouter une treecommande imprimera comme ceci:

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

Ajout d'un petit point à la réponse de @ apuche pour la fonctionnalité sans racine OSX El Capitan . make installéchoue car nous ne sommes pas autorisés à écrire dans le /usr/binrépertoire.

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, il suffit de modifier Makefilepour avoirprefix = /usr/local

vikas027
la source
Eh bien, cela fonctionne techniquement. Mais c'est envahissant. Donc , vous pourriez probablement courir ./configure --prefix=/usr/localavant d' exécuter makeet make installil permettrait d' atteindre les mêmes résultats.
JakeGould
2
@JakeGould Absolument, je l'utilise prefixdans de tels scénarios. Mais il n'y a pas de configurefichier dans la dernière version de tree (1.7.0) maintenant. Le INSTALLfichier dans le répertoire décompressé dit simplement d'utiliser makeet make installtout de suite.
vikas027
2

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
l --marc l
la source
2

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 meta = …ligne pour extraire différentes métadonnées à afficher, en sélectionnant à la main les éléments fractionnés 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 beau dans le terminal OS X que la police sur 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
Phrogz
la source
2
Merci beaucoup pour la solution légère! Sous OSX 10.9.5 (Ruby 2.0.0), en raison d'une erreur 'pas de conversion implicite de true en String (TypeError)', j'ai dû modifier la sixième ligne de la méthode #tree pour lire file = File.basename. (path) + (File.directory?(path)? '/': '')
joel.neely
1

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'
Eddie B
la source
1
  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
KunMing Xie
la source
1
Déjà mentionné dans deux réponses précédentes en 2011 et en 2016. Avons-nous besoin d'une troisième réponse disant la même chose?
Jason S
0

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/.profileou .bash_profile, puis actualisez le profil avec: source .profileousource .bash_profile

marshki
la source