Ubuntu “tree” komutunun Mac OS X eşdeğeri


Yanıtlar:


438

Sen alabilirsiniz treede MacOS üzerinde komutu. Homebrew'ınız varsa , yapmanız gereken tek şey koşmak:

brew install tree

Detaylar için okumaya devam edin.


Paket yöneticisi ile

MacOS için birkaç paket yöneticisi var. En popüler olanlar: Homebrew , MacPorts veya Fink . İkisinden birini yükleyebilirsiniz, ancak Homebrew'ı öneririm. Aynı anda bunlardan birden fazla kurulum yapmayın!

Web sitesindeki talimatları izleyin, ardından hangi paket yöneticisini seçtiğinize bağlı olarak aşağıdaki komutlardan birini çalıştırın.

Homebrew için:

brew install tree

MacPorts için:

sudo port install tree

Fink için:

fink install tree

Paket yöneticileri, varsayılan olarak macOS ile gelmeyen GNU / Linux programları da dahil olmak üzere diğer komut satırı programları sunar.

Kaynaktan yükleme

Öncelikle, Xcode komut satırı araçlarını çalıştırarak yüklemelisiniz xcode-select --install.

Ardından, karşıdan treekaynağı . Sonra işe almak için Makefile değiştirmek de açıklanmıştır ki, aşağıda @ apuche cevabı . Linux seçeneklerini yorumlamak ve macOS seçeneklerini yorumlamak yeterli olmalı.

Sonra koş ./configureo zaman make.

Şimdi treeikili dosyayı çalıştırılabilir yolunuzdaki bir yere taşımalısınız. Örneğin:

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

Şimdi ~/.bash_profileeklemek için düzenleyin :

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

Kabuğu yeniden yükleyin ve şimdi which treegöstermelisiniz /usr/local/bin/tree.


shaunchapmanblog.com/post/329270449/… ayrıca ayrıntılı talimatlara sahip görünüyor, ancak Xcode 4.x kullanıyorsanız / Developer altında yaşayan llvm-gcc ile ilgili sorunlara neden olabilir; Etrafta biraz uğraşmak hile yapmak gerekir.
Ahmed Masud

1
@DavidMoles Çünkü sadece makeOS X'te çalışmak işe yaramıyor. Öncelikle, Xcode komut satırı araçlarının nasıl kurulacağını bilmek zorundasınız (veya genellikle yazılım oluşturma hakkında bir fikriniz var) ve sonra tanımsız bir sembol üzerinde hata yaptığını göreceksiniz. Bu yüzden makefile üzerinde bazı ayarlamalar yapmanız gerekiyor ( burada açıklandığı gibi ). Çok fazla güçlük IMO.
slhck

3
@ Birçok kişi çok basit CLI görevler için birkaç komut satırı araçlarını biliyor 7stud ve onlar olabilir değil yazılım derlemek için biliyorum. İnsanlar bazen ne ./configureve maketam olarak ne yaptığını ve neden en başta bunlara ihtiyaç duyulduğunu anlamakta zorlanırlar . Ya da onunla uğraşmak istemiyorlar. Veya bunun için herhangi bir yardım dosyasını okuyun. Böyle bir şey yapmayı tercih ederler apt-get install. Kurulumu kaynaktan tercih ederseniz sorun değil (ve ben şahsen ben de yaparım), ancak başkaları tarafından daha kolay algılanan çözümler olduğunu, hatta normal bilgisayar kullanıcılarının bile çoğunluğunu kabul etmek zorundasınız.
slhck

1
İnsanlar bazen neyi ./configure anlamak için mücadele ve tam yetinmek ve bu ilk etapta ihtiyaç vardır neden 15 yıldır kaynağından yazılım yüklemeden ettik ve ben hiçbir fikrim yok ./configureve makeyap. Sadece yazılımı yüklemek için gerçekleştirmem gereken adımlar olduklarını biliyorum. README ve INSTALL dosyalarını kör olarak okudum ve ne diyorsa onu yapıyorum.
7

1
@DhruvGhulati Bildiğimden değil, ama tersine çevirebilirsiniz grep. Gibi tree | grep -v 'json'ya da benzeri.
slhck

33

Tam olarak aynı değil, ancak Mac'te hızlı bir yol:

find .

ve bu kadar. Geçerli dizindeki tüm dosya yollarını bir liste olarak listeler.


Belirli bir dizinde ilgilenen varsa: ./ <dir_name> bulmak
raspacorp

Sadece dosyalarla ilgileniyorsanız,find . -type f
Jared Beck

2
Dizin yapısını find . -type d -maxdepth 2sadece benim için çalıştığını göstermek için sadece birkaç seviyeye inmekle ilgilenmiştim
Matthew Lock

find *Gizli dosyaları ve dizinleri görmek istemiyorsanız daha iyi kullanın . treeGizli dosyaları ve dizinleri varsayılan olarak göstermez.
asmaier

findbir 万金油 araçtır.
Evan Hu

22

Ya Yöneticiniz herhangi yüklemek izin vermezse brew, fink, porther zaman kaynağından inşa edebilirsiniz araçlar:

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

Linux bölümünü ve uncomment osx alanını yorumlamak için Makefile dosyasını düzenleyin:

# 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

İsteğe bağlı: Renkli çıktıyı zorlama

Ve siz onun yanındayken, ağacı her zaman çıktıyı renklendirmeye zorlamak istiyorsanız, her zaman dosyanın mainyöntemini düzenleyebilir tree.cve daha force_color=TRUE;önce ekleyebilirsiniz.setLocale(LC_TYPE,"");

Sonunda vurun makeve treemac için oluşturmayı bitirdiniz .

Tribute , blogundaki orjinal yazısı için Shaun Chapman'a gidiyor .


Shaun'un web sitesine ulaşılamadı; Makefile’ı değiştirdiğiniz için teşekkürler.
Paul Nathan

Özellikle, ekleyebilirsiniz force_color = TRUE;. Noktalı virgül yok ve derleme hatası alıyorsunuz.
tgrosinger

1
Ben sadece ve yerine sürümünü 1.7 inşa ettik setLocaleonun setlocale. Öyleyse tree.c, sen bak setlocale(LC_TYPE,""); ve teşekkürler!
Avi Cohen

Mükemmel cevap. Nasıl taşınacağına dair bir not ekleyebilir misiniz /bin(ya da küresel olarak kullanılabilmesi için bazı yollara)?
Khanh Nguyen

Bilginize, 1.7.0'ı Yosemite altında derledim warning: format specifies type 'long' but the argument has type 'long long'. Düzeltme, bir format belirticisini - olarak %9lddeğiştirmekti %9lld.
David Moles,


18

Resmi bir treekomut yoktur, ancak bunu yapabilirsiniz:

Aşağıdaki betiği / usr / local / bin / tree dizinine kaydedin.

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

İzinleri değiştirerek çalıştırabilmeniz için:

chmod 755 /usr/local/bin/tree 

Tabii ki oluşturmanız gerekebilir /usr/local/bin:

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

Tüm seçenekleri özlüyor tree, ama yine de güzel bir küçük çözüm.
slhck

@slhck hehe hızlı kesmek bir çözüm oldu ...
Ahmed Masud

Yine de değişkenlerinizi alıntılamak isteyebilirsiniz.
slhck

$ x "$ dir" olmalı, "$ @" özel genişlemesi nedeniyle alıntı yapılmamalı
Ahmed Masud

1
@JenS. Tabii ki bununla başa çıkmak için bul komutunu değiştirebilirsiniz
Ahmed Masud

5

Kullanarak alternatif findve awk:

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

4

Burada basit bir çözüm buldum: http://murphymac.com/tree-command-for-mac/

Yani aşağıdaki ekleyerek .bashrc, .bash_profileya da başka herhangi bir yerde o iş yapacak:

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

Şimdi bir treekomut eklemek bu şekilde basılacaktır:

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

3

Küçük bir nokta ekleme @ apuche cevabı OSX El Capitan için köksüz özelliği. dizine make installyazma yetkimiz olmadığı için başarısız oluyor /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$

Bunun üstesinden gelmek için, sadece düzenleme Makefileyapmakprefix = /usr/local


Bu teknik olarak işe yarıyor. Ama istilacı. Yani muhtemelen koşmadan ./configure --prefix=/usr/localönce kaçabilir makeve make installaynı sonuçları elde edersiniz .
JakeGould,

2
@JakeGould Kesinlikle, prefixbu tür senaryolarda kullanırım. Ancak şimdi ağacınconfigure en son sürümünde (1.7.0) dosya yok . Çýkartýlan dizindeki dosya sadece kullanmayı diyor ve derhal. INSTALLmakemake install
vikas027

2

Terminal.app'de kullanmak için aşağıdakileri ~ / .bash_profile dosyasına ekledim. Bulmanın nasıl kullanıldığını hatırlamaya yardımcı olmak için bazı yorumlar eklenmiştir.

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

mevcut dizin için örnek

$> tree

bazı yol için örnek

$> tree /some/path

2

İşte yararlı meta verileri ile birlikte güzel bir Unicode ağacı üreten bir Ruby script çözümü.

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

Bir meta = …sonraki satırdaki bölünmüş parçaları elle seçerek görüntülemek üzere farklı meta veriler elde etmek için çizgiyi değiştirebilirsiniz . Biraz daha fazla çalışmayla, gösterilecek meta verileri seçmek için isteğe bağlı argümanları iletebilirsiniz.

Örnek çıktı (OS X terminalinde Stack Overflow'taki yazı tipinden daha iyi görünüyor):

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
Hafif çözüm için çok teşekkürler! OSX 10.9.5'te (çalışan Ruby 2.0.0), 'true' nin String (TypeError) biçimine dönüştürülmemesi nedeniyle hata oluştuğundan, #tree yönteminin altıncı satırını file dosyasını okumak için değiştirmek zorunda kaldım = File.basename (path) + (File.directory?(path)? '/': '')
joel.neely

1

Gnu ağacı kadar güzel değil ... ama bash'te takma adı çok kolaydır ... G seçeneğini Osx'in rengine dokunarak küçük bir renk bile ekleyebilirsiniz.

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

1
  1. Xcode yükleyin

  2. Komut Satırı Araçlarını Alın

xcode-select --install
  1. Homebrew'i yükleyin
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Ağaç yüklemek
brew install tree

1
Daha önce 2011 ve 2016'da verilen iki cevapta daha önce bahsedilmiştir. Aynısını söyleyen üçüncü bir cevaba ihtiyacımız var mı?
Jason S

0

Oyuna geç kaldım ama aynı sorum vardı. İş yeri kısıtlamaları nedeniyle, bir kaynaktan veya üçüncü taraf bir paket yöneticisi aracılığıyla bir paket kuramadım.

Bu benim uygulamam:

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

Fonksiyonu /Users/foo/.profileveya altına eklemeniz yeterlidir .bash_profile, ardından profili: source .profileveya: ile yenileyin.source .bash_profile

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.