用于创建“漂亮”目录树的ASCII库?


75

是否有一些* nix工具或perl / php库,可让您轻松创建类似于以下内容的目录树可视化效果?

www
|-- private
|    |-- app 
|    |    |-- php
|    |    |    |-- classes
|    |    |    +-- scripts
|    |    |-- settings
|    |    +-- sql
|    +-- lib
|         +-- ZendFramework-HEAD
+-- public
    |-- css
    |-- images
    +-- scripts

4
如果有人在Windows上寻找这种解决方案(我曾经是!),则只需tree在命令行中键入即可。
Dan Atkinson

Answers:


111

Unix Tree / Linux Tree中的示例如何?

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'  

14
您一定会喜欢
单线

2
那真是令人作呕,但是我​​喜欢上面的输出的部分原因是它不是全部连字符到文件中,而是让那些管道垂直连接子目录
Alan Storm 2009年

1
:您可能会检查这个人的解决方案出来,然后sandeep-vaniya.blogspot.com/2008/04/...
bobbymcr

1
大!尽管输出不正确(我没有批评太多,而没有添加构造性批评),但是当我尝试子目录中的文件时,它们都被组合在一起了吗?
monojohnny,2012年

3
有谁知道您将如何添加到该脚本,以便它也显示目录中的文件?
Raigex

80

那个oneliner很酷,我建议使用tree util。

bash-3.2$ mkdir -p this/is/some/nested/example
bash-3.2$ mkdir -p this/is/another/super/nested/example
bash-3.2$ mkdir -p this/is/yet/another/example
bash-3.2$ mkdir -p this/is/some/nested/other/example
bash-3.2$ tree this
this
`-- is
    |-- another
    |   `-- super
    |       `-- nested
    |           `-- example
    |-- some
    |   `-- nested
    |       |-- example
    |       `-- other
    |           `-- example
    `-- yet
        `-- another
            `-- example

13 directories, 0 files

20
对于Mac上的用户,brew install tree
briangonzalez 2013年

8
我在使用特殊字符作为默认值的树上苦苦挣扎,但是codealpha.net/696/…的建议是使用tree --charset=ASCII,这样树就可以像上面的user1116793的示例中那样生成字符。
Brady Trainor 2014年

它也有一些创造性的用途。我用它来可视化我的任务(大多数工具没有真正的分层功能-甚至Jira也没有)。
斯里达·萨诺巴特

18

我意识到这个问题早在很久以前就得到了回答,但是我才发现这个叫做tree的程序也很酷。


1
应该将其标记为正确答案。它支持dircolors,并且输出布局更加美观。对于Mac OS X用户,它甚至也是一个Macport。
Sridhar Sarnobat 2012年

3
tree对于从Macports迁移过来的人,也可以使用Homebrew安装。
jeffbyrnes

应该注意的是,对于Windows,您只需tree在命令行中键入即可。无需安装任何东西。
Dan Atkinson

16

RecursiveTreeIterator

允许在RecursiveIterator上进行迭代以生成ASCII图形树。

$treeIterator = new RecursiveTreeIterator(
    new RecursiveDirectoryIterator('/path/to/dir'),
    RecursiveTreeIterator::SELF_FIRST);

foreach($treeIterator as $val) echo $val, PHP_EOL;

输出将是这样的(在我的机器上是c:\ php):

|-c:\php5\cfg
|-c:\php5\data
| |-c:\php5\data\Base
| | \-c:\php5\data\Base\design
| |   |-c:\php5\data\Base\design\class_diagram.png
| |   \-c:\php5\data\Base\design\design.txt
| |-c:\php5\data\ConsoleTools
| | \-c:\php5\data\ConsoleTools\design
| |   |-c:\php5\data\ConsoleTools\design\class_diagram.png
| |   |-c:\php5\data\ConsoleTools\design\console.png
| |   |-c:\php5\data\ConsoleTools\design\console.xml
…

9

与--tree的exa表现出色:

exa --tree ~/tmp/public/

<dir>
├── aboutme
│  └── index.html
├── atrecurse
│  └── index.html
├── base.css
├── html5
│  ├── cat-and-mouse
│  └── frantic
│     ├── css
│     │  └── main.css

发现这晚了,但是很棒!开发一种用于为特定类型的项目生成文件树的工具,exa -T -D确实非常有帮助。谢谢!
kingkupps



1

[php]调整树符号,取自https://gist.github.com/hakre/3599532

<?php
$path = './targetdir';
$unicodeTreePrefix = function(RecursiveTreeIterator $tree){
  $prefixParts = [
      RecursiveTreeIterator::PREFIX_LEFT         => ' ',
      RecursiveTreeIterator::PREFIX_MID_HAS_NEXT => '+ ',
      RecursiveTreeIterator::PREFIX_END_HAS_NEXT => '├ ',
      RecursiveTreeIterator::PREFIX_END_LAST     => '└ '
    ];
  foreach ($prefixParts as $part => $string) {
      $tree->setPrefixPart($part, $string);
  }
};
$dir  = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_FILENAME | RecursiveDirectoryIterator::SKIP_DOTS);
$tree = new RecursiveTreeIterator($dir);
$unicodeTreePrefix($tree);
echo "<br><br>";
echo "[$path]<br>";
foreach ($tree as $filename => $line) {
  echo $tree->getPrefix(), $filename, "<br>";
}

输出示例

[./targetdir]<br> ├ aHR0cHM<br> ├ gtyyu.txt<br> ├ Screenshot at 2020-05-28 22-23-30.png<br> ├ 2004 - Synchrone<br> + ├ 09-Live for willyman.mp3<br> + ├ 04-Inabox.mp3<br> + ├ 05-Trashastan.mp3<br> + ├ 07-Nordick.mp3<br> + ├ 08-Rupture.mp3<br> + ├ Best of<br> + + ├ 08 - Civil War.mp3<br> + + ├ 09 - 14 Years.mp3<br> + + ├ 05 - Welcome To The Jungle.mp3<br> + + ├ 06 - Don't Cry.mp3<br> + + ├ 04 - Sweet Child O' Mine.mp3<br> + + ├ 02 - Paradise City.mp3<br> + + ├ 07 - Yesterdays.mp3<br> + + ├ 03 - Patience.mp3<br> + + ├ 01 - November Rain.mp3<br> + + └ 10 - Estranged.mp3<br> + ├ 03-Sarangui.mp3<br> + ├ 06-The test.mp3<br> + ├ 01-Sabradub.mp3<br> + └ 02-L'uzure.mp3<br> ├ Screenshot at 2020-02-11 12-31-52.png<br> ├ trur.txt<br> ├ .hidden<br> + ├ .sub_article.txt<br> + └ sub_article_in_hidden.txt<br> ├ gtuitre.txt<br> ├ aHR0cHM.txt<br> ├ CREEP.mp3<br> ├ subfolder<br> + └ sub_article.txt<br> ├ filtle.txt<br> ├ Best of<br> + ├ 08 - Civil War.mp3<br> + ├ 09 - 14 Years.mp3<br> + ├ 05 - Welcome To The Jungle.mp3<br> + ├ 06 - Don't Cry.mp3<br> + ├ 04 - Sweet Child O' Mine.mp3<br> + ├ 02 - Paradise City.mp3<br> + ├ 07 - Yesterdays.mp3<br> + ├ 03 - Patience.mp3<br> + ├ 01 - November Rain.mp3<br> + └ 10 - Estranged.mp3<br> ├ Screenshot at 2020-05-12 14-51-56.png<br> ├ of.txt<br> ├ highlight.css<br> └ Screenshot at 2020-06-10 19-28-51.png<br>


1

近年来,这已经发生了很多变化。软件包管理器中的linux版本更加干净和彩色:

Debian / Ubuntu:

sudo apt install tree

CentOS / RHEL / OpenSUSE:

sudo yum install tree

如果您的current_directory结构有一个庞大的子目录,并且只想显示该结构包含的样本,则可以执行以下操作:

tree -P *my_own_pattern_to_find* current_directory

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.