Question Mac OS X équivalent de la commande "tree" d'Ubuntu


Y a-t-il un équivalent à Ubuntu tree commander pour Mac OS X?


265
2017-11-21 10:38


origine




Réponses:


Oui, il y a, et ça s'appelle tree.

Vous pouvez l'installer

  • de source ou
  • avec un gestionnaire de paquets

Le premier peut sembler un peu compliqué si vous n'avez jamais compilé le code source auparavant. Cela nécessite l'édition de quelques fichiers. Ce dernier a un peu de surcharge (car vous n'avez peut-être pas besoin d'un gestionnaire de paquets pour un seul outil), mais il est généralement beaucoup plus facile à installer tree et autres logiciels.


Installation à partir de la source

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

Alors, télécharger le tree la source. alors changer le Makefile pour le faire fonctionner, qui est également expliqué dans La réponse de @ apuche ci-dessous. Commenter les options Linux et décommenter les options OS X devrait suffire.

Ensuite, courez ./configure, puis make.

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

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

Maintenant, éditez votre ~/.bash_profile inclure:

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

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


Avec un gestionnaire de paquets

Il existe plusieurs gestionnaires de paquets pour OS X. Les plus populaires sont: Homebrew, MacPorts, ou Mouchard (trié dans l'ordre que je recommanderais). Installez l'une de ces premières - installez simplement un, pas tout.

Exécutez ensuite l’une des commandes suivantes, en fonction du gestionnaire de paquets 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 de ligne de commande, y compris ceux de GNU / Linux qui ne sont pas fournis avec OS X par défaut.


371
2017-11-21 10:52



@slhck: merci! Installation Homebrew + brew install tree travaillé comme un charme :) - Misha Moroshko
@DavidMoles Parce que simplement en cours d'exécution make sous OS X ne fonctionne pas. Tout d'abord, vous devez savoir comment installer les outils de ligne de commande Xcode (ou en général, ont une idée de la construction de logiciels) et vous verrez que ce erreurs sur un symbole non défini. Donc, vous devez faire quelques ajustements sur le makefile (comme expliqué ici). Trop de tracas IMO. - slhck
@ 7stud Beaucoup de gens connaissent quelques outils en ligne de commande pour des tâches CLI très simples, et ils peuvent ne pas savoir compiler des logiciels. Les gens ont parfois du mal à comprendre quoi ./configure et make exactement et pourquoi ceux-ci sont nécessaires en premier lieu. Ou ils ne veulent pas s'en occuper. Ou lisez tous les fichiers d'aide, d'ailleurs. Ils préfèrent faire quelque chose comme apt-get install. Il est très bien si vous préférez les installations de la source (et je le fais personnellement, aussi), mais vous devez accepter qu'il existe des solutions qui sont perçus comme plus facile par d'autres, ou peut-être même la majorité des utilisateurs d'ordinateurs normaux. - slhck
Les gens ont parfois du mal à comprendre ce qui est fait et à quoi faire, et pourquoi ceux-ci sont nécessaires en premier lieu.  J'installe des logiciels depuis la source depuis 15 ans, et je n'ai aucune idée de ce que ./configure et make faire. Je sais juste que ce sont des étapes à suivre pour installer un logiciel. Je lis aveuglément les fichiers README et INSTALL, et je fais tout ce qu’il dit. - 7stud
@DhruvGhulati Pas que je sache, mais vous pouvez inversergrep il. Comme tree | grep -v 'json' ou similaire. - slhck


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

find .

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


25
2018-05-02 13:31



Si vous êtes intéressé par un répertoire particulier: find ./ <dir_name> - raspacorp
Si seulement intéressé par les fichiers, find . -type f - Jared Beck
Je n'étais intéressé que par quelques niveaux de profondeur pour montrer la structure du répertoire afin find . -type d -maxdepth 2 travaillé pour moi - Matthew Lock
Meilleure utilisation find * si vous ne souhaitez pas voir les fichiers et répertoires cachés. tree ne montre pas les fichiers et répertoires masqués par défaut. - asmaier


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

Modifiez les autorisations pour pouvoir l'exécuter:

chmod 755 /usr/local/bin/tree 

Bien sûr, vous devrez créer /usr/local/bin:

sudo mkdir -p /usr/local/bin/tree 

18
2017-11-21 10:53



Il manque toutes les options de tree, mais toujours une belle petite solution. - slhck
@slhck hehe c'était une solution rapide de piratage ... - Ahmed Masud
Vous voudrez peut-être citer vos variables. - slhck
@JenS. bien sûr, vous pouvez simplement changer la commande de recherche pour faire face à cela - Ahmed Masud
génie - aime ça - xaphod


Vous devriez probablement utiliser homebrew. Si tu fais:

brew install tree

18
2018-06-30 16:30



J'étais sur le point de répondre avec ça. Bon spectacle. - alfonso
Suggestion simple mais puissante. Merci. - Gearon


Ou si votre administrateur ne vous laissera installer aucun des brew, fink, port outils que vous pouvez toujours 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écommentez 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 sortie couleur

Et pendant que vous y êtes, si vous voulez forcer un arbre à toujours coloriser la sortie, vous pouvez toujours modifier le main méthode de la tree.c déposer et ajouter force_color=TRUE; avant setLocale(LC_TYPE,"");

Enfin frappé make et vous avez fini de construire tree pour Mac.

Hommage à Shaun Chapman pour son post original sur son blog.


16
2017-07-14 23:09



Impossible de se rendre sur le 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
Je viens de construire la version 1.7 et au lieu de setLocale ses setlocale. Donc en tree.c, tu cherches 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 vers /bin (ou un chemin pour qu'il puisse être utilisé globalement)? - Khanh Nguyen
FYI, compiler 1.7.0 sous Yosemite, j'ai: warning: format specifies type 'long' but the argument has type 'long long'. La solution consistait à modifier un spécificateur de format à partir de %9ld à %9lld. - David Moles


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
2018-04-07 12:10





Ajouter un petit point à La réponse de @apuche pour OSX El Capitan sans racine fonctionnalité. make install échoue car nous ne sommes pas autorisés à écrire dans /usr/bin annuaire.

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 avoir prefix = /usr/local


3
2018-01-12 03:16



Eh bien, cela fonctionne techniquement. Mais c'est envahissant. Donc vous pourriez probablement courir ./configure --prefix=/usr/local avant de courir make et make install et il obtiendrait les mêmes résultats. - JakeGould
@JakeGould Absolument, j'utilise prefix dans de tels scénarios. Mais il n'y a pas configure fichier dans la dernière version de arbre (1.7.0) maintenant. le INSTALL fichier dans le répertoire décompressé dit simplement à utiliser make et make install tout de suite. - vikas027


J'ai ajouté ce qui suit à ~ / .bash_profile pour l'utiliser dans Terminal.app. Certains commentaires sont inclus pour vous rappeler comment 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 en cours

$> tree

exemple pour un chemin

$> tree /some/path

2
2018-06-05 02:20





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 le meta = … ligne pour extraire les différentes métadonnées à afficher, en sélectionnant à la main les pièces fractionnées sur la ligne suivante. Avec un peu plus de travail, vous pouvez passer des arguments ls arbitraires pour sélectionner les métadonnées à afficher.

Exemple de sortie (semble plus agréable dans le terminal OS X que dans 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

2
2017-11-27 19:19



Merci beaucoup pour la solution légère! Sous OSX 10.9.5 (stock Ruby 2.0.0 en cours d'exécution), en raison d'une erreur de conversion implicite de true en String (TypeError), j'ai dû changer la sixième ligne de la méthode #tree pour lire file = File.basename (chemin) + (File.directory?(path)? '/': '') - joel.neely