396 votes

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

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

10voto

Shashank Agrawal Points 203

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

Donc, en ajoutant 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 un tree s'imprimera comme ceci :

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

1 votes

Superbe petite ligne simple, mais elle ne fonctionne que pour le répertoire courant.

0 votes

Alors, qu'essayez-vous d'atteindre ?

0 votes

Parfois, j'aimerais dessiner un arbre d'un autre répertoire. Par exemple, je suis dans mon répertoire personnel et je veux voir ce qu'il y a dans, disons.., /tmp . Comprenez que j'aime l'élégance de cette phrase et que j'ai voté votre réponse, mais je voulais juste souligner que cela ne remplace pas complètement la "vraie" réponse. tree au cas où quelqu'un le chercherait.

6voto

Sergey Borodavkin Points 155

Une alternative utilisant find y awk :

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

0 votes

Cela aligne le tuyau du sous-répertoire avec la première lettre du répertoire parent, ce que je préfère de loin à la commande SED répétée dans de multiples réponses, qui indente simplement le sous-répertoire de deux espaces, mais donne quatre soulignements avant le répertoire parent. Je préfère également les tirets.

3voto

Phrogz Points 968

Voici une solution Ruby script qui produit un bel arbre Unicode accompagné de 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 le meta = … pour extraire différentes métadonnées à afficher, en sélectionnant à la main les éléments divisé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 (la police est plus belle dans le terminal OS X que 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 votes

Merci beaucoup pour cette solution légère ! Sur OSX 10.9.5 (avec Ruby 2.0.0), à cause d'une erreur 'no implicit conversion of true into String (TypeError)', j'ai dû changer la sixième ligne de la méthode #tree pour lire file = File.basename(path) + (File.directory ?(path) ? '/' : '')

3voto

vikas027 Points 141

Ajout d'un petit point à La réponse de @apuche pour OSX El Capitan sans racines fonction. make install échoue puisque nous ne sommes pas autorisés à écrire dans /usr/bin ré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 Makefile d'avoir prefix = /usr/local

1 votes

Eh bien, ça marche techniquement. Mais c'est invasif. Donc vous pourriez probablement exécuter ./configure --prefix=/usr/local avant d'exécuter make y make install et cela donnerait les mêmes résultats.

2 votes

@JakeGould Absolutely, I do use prefix dans de tels scénarios. Mais il n'y a pas configure dans la dernière version de arbre (1.7.0) maintenant. Le site INSTALL dans le répertoire dézippé dit simplement d'utiliser make y make install tout de suite.

2voto

Edward J Beckett Points 999

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X