Pertanyaan Mac OS X setara dengan perintah "pohon" Ubuntu


Apakah ada yang setara dengan Ubuntu tree perintah untuk Mac OS X?


265
2017-11-21 10:38


asal




Jawaban:


Ya, ada, dan itu disebut tree.

Anda dapat menginstalnya

  • dari sumber atau
  • dengan seorang manajer paket

Yang pertama mungkin tampak sedikit rumit jika Anda belum pernah mengkompilasi kode sumber sebelumnya. Diperlukan pengeditan beberapa file. Yang terakhir memiliki sedikit overhead (karena Anda mungkin tidak memerlukan manajer paket hanya untuk satu alat), tetapi umumnya lebih mudah untuk menginstal tree dan paket perangkat lunak lainnya.


Menginstal dari sumber

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

Kemudian, unduh tree sumber. Kemudian ubah Makefile agar berfungsi, yang juga dijelaskan dalam Jawaban @ apuche di bawah ini. Mengomentari opsi Linux dan menghapus tanda komentar opsi OS X seharusnya sudah cukup.

Lalu lari ./configure, kemudian make.

Sekarang Anda harus memindahkannya tree file 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 ~/.bash_profile untuk memasukkan:

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

Muat kembali shell, dan sekarang which tree harus menunjuk ke /usr/local/bin/tree.


Dengan seorang manajer paket

Ada beberapa manajer paket untuk OS X. Yang paling populer adalah: Homebrew, MacPorts, atau Pengadu (diurutkan dalam urutan yang saya sarankan). Instal salah satu dari yang pertama - cukup instal satu, tidak semua.

Kemudian jalankan salah satu dari perintah berikut, tergantung pada manajer paket mana yang Anda pilih.

Untuk Homebrew:

brew install tree

Untuk MacPorts:

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 OS X secara default.


372
2017-11-21 10:52



@slhck: Terima kasih! Menginstal Homebrew + brew install tree bekerja seperti pesona :) - Misha Moroshko
@DavidMoles Karena hanya berlari make di OS X tidak berfungsi. Pertama, Anda harus tahu cara menginstal alat baris perintah Xcode (atau secara umum, memiliki beberapa gagasan tentang membangun perangkat lunak) dan kemudian Anda akan menemukan bahwa kesalahan itu salah pada simbol yang tidak terdefinisi. Jadi Anda harus melakukan beberapa penyesuaian pada makefile (seperti yang dijelaskan sini). Terlalu merepotkan IMO. - slhck
@ 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 kadang-kadang berjuang untuk memahami apa ./configure dan make tepatnya dan mengapa itu dibutuhkan di tempat pertama. Atau mereka tidak mau menghadapinya. Atau baca file bantuan apa pun, dalam hal ini. Mereka lebih suka melakukan sesuatu seperti apt-get install. Tidak apa-apa 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 sebagian besar pengguna komputer normal. - slhck
Orang kadang-kadang berjuang untuk memahami apa. / Mengkonfigurasikan dan membuat persis dan mengapa itu dibutuhkan di tempat pertama  Saya sudah menginstal perangkat lunak dari sumber selama 15 tahun, dan saya tidak tahu apa ./configure dan make melakukan. Saya hanya tahu mereka adalah langkah-langkah yang perlu saya lakukan untuk menginstal perangkat lunak. Saya membabi buta membaca file README dan INSTALL, dan saya melakukan apa pun yang dikatakannya. - 7stud
@DhruvGhulati Bukan yang saya tahu, tetapi Anda bisa inversegrep saya t. Seperti tree | grep -v 'json' atau serupa. - slhck


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

find .

dan hanya itu. Ini akan daftar semua path file dalam direktori saat ini sebagai daftar.


25
2018-05-02 13:31



Jika tertarik dengan direktori tertentu: temukan ./ <dir_name> - raspacorp
Jika hanya tertarik dengan file, find . -type f - Jared Beck
Saya hanya tertarik untuk melakukan beberapa level untuk menunjukkan struktur direktori find . -type d -maxdepth 2 bekerja untukku - Matthew Lock
Lebih baik digunakan find * jika Anda tidak ingin melihat file dan direktori tersembunyi. treetidak menampilkan file dan direktori tersembunyi secara default. - asmaier


Tidak ada yang formal tree Namun perintah per se dapat Anda lakukan 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 sehingga Anda dapat menjalankannya:

chmod 755 /usr/local/bin/tree 

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

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

18
2017-11-21 10:53



Ini merindukan semua opsi tree, tapi masih merupakan solusi kecil yang bagus. - slhck
@slhck hehe itu adalah solusi hack cepat ... - Ahmed Masud
Anda mungkin ingin mengutip variabel Anda. - slhck
@JenS. tentu saja Anda dapat dengan mudah mengubah perintah find untuk mengatasinya - Ahmed Masud
jenius - suka itu. - xaphod


Anda mungkin harus menggunakan homebrew. Jika kamu melakukan:

brew install tree

18
2018-06-30 16:30



Saya akan menjawab dengan ini. Pertunjukan yang bagus. - alfonso
Saran sederhana namun kuat. Terima kasih. - Gearon


Atau jika administrator Anda tidak mengizinkan Anda menginstal apa pun brew, fink, port alat Anda selalu dapat membangunnya 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 menghapus 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 output warna

Dan sementara Anda melakukannya, jika Anda ingin memaksa pohon untuk selalu mewarnai output, Anda selalu dapat mengedit main metode dari tree.c file dan tambahkan force_color=TRUE; sebelum setLocale(LC_TYPE,"");

Akhirnya memukul make dan Anda sudah selesai membangun tree untuk Mac.

Upeti pergi ke Shaun Chapman untuk pos aslinya di blognya.


16
2017-07-14 23:09



Tidak dapat membuka situs web Shaun; terima kasih atas kepala di memodifikasi Makefile. - Paul Nathan
Secara khusus, Anda dapat menambahkan force_color = TRUE;. Tidak ada titik koma dan Anda mendapatkan kesalahan kompilasi. - tgrosinger
Saya baru saja membangun versi 1.7 dan bukannya setLocale -nya setlocale. Jadi dalam tree.c, Anda mencari setlocale(LC_TYPE,""); dan terimakasih! - Avi Cohen
Jawaban yang bagus. Bisakah Anda menambahkan catatan tentang cara memindahkannya /bin (atau jalur tertentu sehingga dapat digunakan secara global)? - Khanh Nguyen
FYI, menyusun 1.7.0 di bawah Yosemite saya mendapat: warning: format specifies type 'long' but the argument has type 'long long'. Perbaikannya adalah mengubah penentu format dari %9ld untuk %9lld. - David Moles


Alternatif menggunakan find dan 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





Menambahkan titik kecil ke Jawaban @ apuche untuk OSX El Capitan tak menentu fitur. make install gagal karena kami tidak diizinkan untuk menulis /usr/bin direktori.

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 saja Makefile memiliki prefix = /usr/local


3
2018-01-12 03:16



Yah, ini secara teknis berhasil. Tapi itu invasif. Jadi Anda mungkin bisa berlari ./configure --prefix=/usr/local sebelum berlari make dan make install dan itu akan mencapai hasil yang sama. - JakeGould
@JakeGould Benar-benar, saya menggunakannya prefix dalam skenario seperti itu. Tetapi tidak ada configure file dalam versi terbaru pohon (1.7.0) sekarang. Itu INSTALL file dalam direktori unzip hanya mengatakan untuk digunakan make dan make install langsung. - vikas027


Saya menambahkan hal berikut 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

2
2018-06-05 02:20





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 bisa memodifikasi meta = … baris untuk mengekstrak metadata yang berbeda untuk ditampilkan, memilih sendiri potongan terpisah pada baris berikutnya. Dengan sedikit lebih banyak pekerjaan Anda bisa melewati argumen ls sewenang-wenang untuk memilih metadata untuk ditampilkan.

Contoh keluaran (terlihat lebih bagus di terminal OS X daripada font di 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



Terima kasih banyak atas solusi ringan! Pada OSX 10.9.5 (menjalankan stock Ruby 2.0.0), karena 'tidak ada konversi implisit true menjadi kesalahan String (TypeError)', saya harus mengubah baris keenam dari metode #tree untuk membaca file = File.basename (jalan) + (File.directory?(path)? '/': '') - joel.neely


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

Jadi, tambahkan yang berikut ini ke Anda .bashrc, .bash_profile atau tempat lain akan membuatnya berfungsi:

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

Sekarang menambahkan a tree perintah akan mencetak seperti ini:

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

2
2017-10-09 07:34





Ini tidak secantik pohon gnu ... tapi itu sangat mudah untuk alias di bash ... Anda bahkan dapat menambahkan sedikit warna dengan menempelkan opsi G ke osx's ls color.

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

1
2018-06-08 07:30