Setara dengan Mac OS X dari perintah “tree” Ubuntu

Jawaban:

438

Anda bisa mendapatkan treeperintah di macOS juga. Jika Anda memiliki Homebrew , yang perlu Anda lakukan adalah menjalankan:

brew install tree

Baca terus untuk detailnya.


Dengan manajer paket

Ada beberapa manajer paket untuk macOS. Yang paling populer adalah: Homebrew , MacPorts , atau Fink . Anda dapat menginstal keduanya, tetapi saya merekomendasikan Homebrew. Jangan menginstal lebih dari satu ini sekaligus!

Ikuti instruksi di situs web, kemudian jalankan salah satu dari perintah berikut, tergantung pada manajer paket mana yang Anda pilih.

Untuk Homebrew:

brew install tree

Untuk MacPort:

sudo port install tree

Untuk Fink:

fink install tree

Manajer paket menawarkan program-program baris perintah lainnya, termasuk yang GNU / Linux yang tidak datang dengan macOS secara default.

Menginstal dari sumber

Pertama, Anda harus menginstal alat baris perintah Xcode dengan menjalankan xcode-select --install.

Kemudian, unduh treesumbernya . Kemudian ubah Makefile untuk membuatnya berfungsi , yang juga dijelaskan dalam jawaban @ apuche di bawah ini . Mengomentari opsi Linux dan menghapus komentar opsi macOS sudah cukup.

Lalu, jalankan ./configure, lalu make.

Sekarang Anda harus memindahkan treefile biner ke lokasi yang ada di jalur eksekusi Anda. Sebagai contoh:

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

Sekarang edit Anda ~/.bash_profileuntuk memasukkan:

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

Muat ulang shell, dan sekarang which treeharus menunjuk ke /usr/local/bin/tree.

slhck
sumber
shaunchapmanblog.com/post/329270449/... juga tampaknya memiliki instruksi terperinci tetapi dapat menyebabkan masalah dengan llvm-gcc hidup di bawah / Pengembang jika Anda menjalankan Xcode 4.x; sedikit mengutak-atik harus melakukan trik.
Ahmed Masud
1
@ Davidvidoles Karena hanya berjalan makedi OS X tidak bekerja. Pertama, Anda harus tahu cara menginstal alat baris perintah Xcode (atau umumnya, memiliki beberapa gagasan tentang membangun perangkat lunak) dan kemudian Anda akan menemukan bahwa kesalahan keluar pada simbol yang tidak ditentukan. Jadi, Anda harus melakukan beberapa penyesuaian pada makefile (seperti yang dijelaskan di sini ). IMO yang terlalu merepotkan.
slhck
3
@ 7stud Banyak orang tahu beberapa alat baris perintah untuk tugas-tugas CLI yang sangat sederhana, dan mereka mungkin tidak tahu cara mengkompilasi perangkat lunak. Orang-orang kadang-kadang berjuang untuk memahami apa ./configuredan makeapa yang harus dilakukan dan mengapa hal itu diperlukan. Atau mereka tidak mau menghadapinya. Atau baca file bantuan apa pun, dalam hal ini. Mereka lebih suka melakukan sesuatu seperti apt-get install. Tidak masalah jika Anda lebih suka instalasi dari sumber (dan saya pribadi juga melakukannya), tetapi Anda harus menerima bahwa ada solusi yang dianggap lebih mudah oleh orang lain, atau mungkin bahkan mayoritas pengguna komputer normal.
slhck
1
Orang-orang kadang-kadang berjuang untuk memahami apa ./configure dan membuat persis lakukan dan mengapa mereka diperlukan di tempat pertama saya telah menginstal perangkat lunak dari sumber selama 15 tahun, dan saya tidak tahu apa ./configuredan apa yang makeharus dilakukan. Saya hanya tahu itu adalah langkah-langkah yang perlu saya lakukan untuk menginstal perangkat lunak. Saya membabi buta membaca README dan INSTALL file, dan saya melakukan apa pun yang dikatakannya.
7stud
1
@ DhruvGhulati Bukan yang saya tahu, tetapi Anda bisa grepmelakukannya. Suka tree | grep -v 'json'atau mirip.
slhck
33

Tidak persis sama, tetapi satu cara cepat di Mac adalah:

find .

dan hanya itu. Ini akan mencantumkan semua jalur file di direktori saat ini sebagai daftar.

nopole
sumber
Jika tertarik pada direktori tertentu: find ./ <dir_name>
raspacorp
Jika hanya tertarik pada file,find . -type f
Jared Beck
2
Saya hanya tertarik untuk pergi beberapa tingkat dalam untuk menunjukkan struktur direktori sehingga find . -type d -maxdepth 2bekerja untuk saya
Matthew Lock
Lebih baik digunakan find *jika Anda tidak ingin melihat file dan direktori tersembunyi. treesecara default tidak menunjukkan file dan direktori tersembunyi.
asmaier
findadalah alat 万金油.
Evan Hu
22

Atau jika administrator Anda tidak akan membiarkan Anda menginstal salah satu brew, fink, portalat Anda selalu dapat membangun dari sumber:

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

Edit Makefile untuk mengomentari bagian linux dan batalkan komentar pada area 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

Opsional: Memaksa keluaran warna

Dan saat Anda melakukannya, jika Anda ingin memaksa pohon untuk selalu mewarnai keluaran, Anda selalu dapat mengedit mainmetode tree.cfile dan menambahkan force_color=TRUE;sebelumsetLocale(LC_TYPE,"");

Akhirnya tekan makedan Anda selesai membangun treeuntuk mac.

Tribute pergi ke Shaun Chapman untuk posting aslinya di blog-nya.

apouche
sumber
Tidak dapat membuka situs web Shaun; terima kasih untuk kepala memodifikasi Modif.
Paul Nathan
Secara khusus, Anda dapat menambahkan force_color = TRUE;. Tidak ada titik koma dan Anda mendapatkan kesalahan kompilasi.
tgrosinger
1
Saya baru saja membangun versi 1.7 dan bukannya setLocaleitu setlocale. Jadi tree.c, Anda mencari setlocale(LC_TYPE,""); dan terimakasih!
Avi Cohen
Jawaban yang bagus Bisakah Anda menambahkan catatan tentang cara memindahkannya /bin(atau beberapa jalur sehingga dapat digunakan secara global)?
Khanh Nguyen
FYI, kompilasi 1.7.0 di bawah Yosemite aku: warning: format specifies type 'long' but the argument has type 'long long'. Cara mengatasinya adalah mengubah specifier format dari %9ldmenjadi %9lld.
David Moles
21

Anda mungkin harus menggunakan homebrew . Jika kamu melakukan:

brew install tree
nichochar
sumber
18

Tidak ada treeperintah formal tetapi Anda dapat melakukan ini:

Simpan skrip berikut ke / 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

Ubah izin agar Anda dapat menjalankannya:

chmod 755 /usr/local/bin/tree 

Tentu saja Anda harus membuat /usr/local/bin:

sudo mkdir -p /usr/local/bin/tree 
Ahmed Masud
sumber
Itu merindukan semua opsi tree, tetapi masih merupakan solusi kecil yang bagus.
slhck
Sslhck hehe itu adalah solusi hack cepat ...
Ahmed Masud
Anda mungkin ingin mengutip variabel Anda.
slhck
$ x harus menjadi $ dirlist tidak boleh dikutip ... karena ekspansi khusus "$ @"
Ahmed Masud
1
@ Jen tentu saja Anda dapat dengan mudah mengubah perintah find untuk menghadapinya
Ahmed Masud
5

Alternatif menggunakan finddan awk:

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

Saya menemukan solusi sederhana di sini: http://murphymac.com/tree-command-for-mac/

Jadi menambahkan yang berikut ke Anda .bashrc, .bash_profileatau tempat lain akan membuatnya berfungsi:

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

Sekarang menambahkan treeperintah akan dicetak seperti ini:

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

Menambahkan poin kecil ke jawaban @ apuche untuk fitur tanpa akar OSX El Capitan . make installgagal karena kami tidak diizinkan menulis ke /usr/bindirektori.

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$

Untuk mengatasinya, cukup edit Makefileuntuk memilikinyaprefix = /usr/local

vikas027
sumber
Nah, ini secara teknis berfungsi. Tapi ini invasif. Jadi, Anda mungkin dapat menjalankan ./configure --prefix=/usr/localsebelum menjalankan makedan make installdan itu akan mencapai hasil yang sama.
JakeGould
2
@ JakeGould Tentu saja, saya menggunakan prefixskenario seperti itu. Tetapi tidak ada configurefile di versi pohon terbaru (1.7.0) sekarang. The INSTALLfile dalam direktori unzip hanya mengatakan untuk menggunakan makedan make installlangsung.
vikas027
2

Saya menambahkan yang berikut ini ke ~ / .bash_profile untuk digunakan di Terminal.app. Beberapa komentar disertakan untuk membantu mengingat bagaimana temuan digunakan.

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

contoh untuk direktori saat ini

$> tree

contoh untuk beberapa jalur

$> tree /some/path
l --marc l
sumber
2

Berikut ini adalah solusi skrip Ruby yang menghasilkan pohon Unicode yang bagus bersama dengan metadata yang berguna.

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

Anda dapat memodifikasi meta = …baris untuk mengekstraksi metadata yang berbeda untuk ditampilkan, memilih sendiri potongan-potongan yang terbagi pada baris berikutnya. Dengan sedikit lebih banyak pekerjaan Anda bisa memberikan argumen sewenang-wenang untuk memilih metadata yang akan ditampilkan.

Output sampel (terlihat lebih bagus di terminal OS X daripada font pada 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
sumber
2
Terima kasih banyak atas solusi ringannya! Pada OSX 10.9.5 (running stock Ruby 2.0.0), karena kesalahan 'tidak ada konversi true menjadi String (TypeError)', saya harus mengubah baris keenam metode #tree untuk membaca file = File.basename (path) + (File.directory?(path)? '/': '')
joel.neely
1

Ini tidak secantik pohon gnu ... tapi sebenarnya mudah alias di bash ... Anda bahkan dapat menambahkan sedikit warna dengan menempelkan opsi G ke warna osx ls.

alias tree='find . -type d | ls -lARG'
Eddie B
sumber
1
  1. Instal Xcode

  2. Dapatkan Alat Baris Perintah

xcode-select --install
  1. Instal Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Instal pohon
brew install tree
KunMing Xie
sumber
1
Sudah disebutkan dalam dua jawaban sebelumnya pada tahun 2011 dan 2016. Apakah kita membutuhkan jawaban ketiga yang mengatakan hal yang sama?
Jason S
0

Terlambat ke pertandingan, tapi aku punya pertanyaan yang sama. Karena pembatasan tempat kerja, saya tidak bisa menginstal paket dari sumber atau melalui manajer paket pihak ketiga.

Ini implementasi saya:

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

Cukup tambahkan fungsi ke /Users/foo/.profileatau .bash_profile, lalu segarkan profil dengan: source .profileatau:source .bash_profile

marshki
sumber