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

91

有没有一些*nix工具或perl/php库可以让您轻松创建目录树视图,看起来像以下内容?

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

7
如果有人在Windows上寻找这个解决方案(就像我一样!),你可以在命令行中简单地输入“tree”。 - Dan Atkinson
10个回答

121

这里有一个来自Unix Tree / Linux Tree的例子,您觉得怎么样:

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

22
你一定会喜欢一个简短的笑话。 - pavium
3
太恶心了,但我喜欢上面的输出部分之一是它不完全是短横线连接文件,你会看到有管道符竖直地连接子目录。 - Alana Storm
1
你可以看看这个人的解决方案:http://sandeep-vaniya.blogspot.com/2008/04/perl-script-for-directory-tree.html - bobbymcr
1
太好了!虽然输出结果不完全正确(我并不是在批评,只是提出建设性的批评意见)——当我尝试时,子目录中的文件都被分组在一起了? - monojohnny
3
有人知道如何修改这个脚本,以便它也显示目录中的文件吗? - Raigex
显示剩余3条评论

89

这个单行代码很棒,我建议使用 tree 实用程序。

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

25
对于使用 Mac 的用户,可以执行 brew install tree 进行安装。 - briangonzalez
8
我曾经遇到过使用特殊字符作为默认的树形结构的问题,但是http://www.codealpha.net/696/putty-and-tree-how-to-avoid-weird-characters-squares/提供的建议是使用`tree --charset=ASCII`命令,这样生成的树形结构字符将会和user1116793在上面的例子中展示的一致。 - Brady Trainor
它也有一些创意用途。我用它来可视化我的任务清单(大多数工具甚至连真正的层级能力都没有-甚至是Jira)。 - Sridhar Sarnobat

20

我知道这个问题早已经有答案了,但是我刚刚发现了一个叫做tree的程序,它也非常不错。


2
这应该被标记为正确答案。它支持dircolors,并且输出更加美观。对于Mac OS X用户来说,甚至还有一个macport。 - Sridhar Sarnobat
4
tree 也可以使用 Homebrew 安装,适用于那些已经从 Macports 转移的用户。 - jeffbyrnes
1
请注意,对于Windows操作系统,您可以直接从命令行输入“tree”命令,无需安装任何程序。 - Dan Atkinson

16

请查看RecursiveTreeIterator类。

该类允许迭代递归迭代器以生成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
…

13

exa with --tree 做得非常好:

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

10

虽然它并不是一个真正的图书馆,但这个小工具非常方便,可以在浏览器中快速生成树形图:https://tree.nathanfriend.io/

免责声明:我是这个工具的作者 :).


最佳答案 - IC_
这真的很棒!已收藏。 - Niko Pasanen

1

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

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>


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接