显示包含文件内容的目录树

显示包含文件内容的目录树

我想在终端树中打印出如下所示的内容:

$ 树 -a
└── .git
    │ │ 分支机构
    │ │ 配置
    │ 描述
    │ 头部
    ═── 钩子
    │ │ ── applypatch-msg.sample
    │ │ ── 提交消息.sample
    │ │ │ │ fsmonitor-watchman.sample
    │ │ ── 更新后.示例
    │ │ ── pre-applypatch.sample
    │ │ ── 预提交.示例
    │ │ ── 准备提交消息.sample
    │ │ ── 预推.示例
    │ │ ── pre-rebase.sample
    │ │ ── 预接收.样本
    │ └── 更新.示例
    │ 信息
    │ └── 排除
    │ │ 物体
    │ │ 信息
    │ └── 包
    └── 参考
        ═── 头
        └── 标签

以图形方式呈现所有文件的内容即它应该分别像吗?


└── .git
    │ │ 分支机构
    │ │ 配置
    |
    | [核心]
    | 存储库格式版本 = 0
    | 文件模式 = 真
    | 裸露 = 假
    | logallrefupdates = 真
    |
    │ 描述
    |
    | 未命名存储库;编辑此文件“描述”来命名存储库。
    |
    │ 头部
    |
    | 参考:refs/heads/master
    |

有没有简单的方法可以达到这个目的?

答案1

我不知道有什么简单的方法可以做到这一点,但我写了一个脚本来做类似的事情。tree我没有像 那样列出花哨的树,而是把它弄平了,就像find

输出(在一个空的 git repo 中,就像您的示例一样):

.git/
.git/branches/
.git/config
==> start .git/config <==
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
==> end .git/config <==

.git/description
==> start .git/description <==
Unnamed repository; edit this file 'description' to name the repository.
==> end .git/description <==

.git/HEAD
==> start .git/HEAD <==
ref: refs/heads/master
==> end .git/HEAD <==

.git/hooks/

...

==> ... <==页眉/页脚灵感来自tail

脚本如下:

#!/bin/bash

# Globs include hidden files, are null if no matches, recursive with **
shopt -s dotglob nullglob globstar

for file in **; do
    # Print filename with an indicator suffix for filetype
    ls --directory --classify -- "$file"
    filetype="$(file --brief --mime-type -- "$file")"
    # Only print text files
    if [[ $filetype == text/* ]]; then
        printf '==> %s %s <==\n' start "$file"
        cat --show-nonprinting -- "$file"
        printf '==> %s %s <==\n' end "$file"
        echo
    fi
done

虽然不漂亮,但还是可以的。颜色至少让它漂亮了:

#!/bin/bash

shopt -s dotglob nullglob globstar

for file in **; do
    ls --directory --classify --color=yes -- "$file"
    filetype="$(file --brief --mime-type -- "$file")"
    # Only print text files
    if [[ $filetype == text/* ]]; then
        printf '\e[32m==> %s %s <==\e[m\n' start "$file"
        cat --show-nonprinting -- "$file"
        printf '\e[31m==> %s %s <==\e[m\n' end "$file"
        echo
    fi
done

截屏:

屏幕截图显示文件名由 <code>ls</code> 着色,“开始”标记为绿色,“结束”标记为红色

答案2

喜欢wjandrea 的解决方案,此解决方案还会展平树以绘制输出。

首次安装batcat有翅膀的克隆人1

sudo apt install bat

现在解决方案是使用命令的一行findfind已作为以下部分预先安装GNU findutils

find -type f -exec batcat {} +

find -type f部分列出了当前工作目录中的所有文件(不包括中间目录)。该-exec batcat {} +部分将文件列表传递给 bat,以便可以打印所有文件和标题。

它的作用就好像命令一样batcat .git/branches .git/config .git/description .git/HEAD .git/hooks/applypatch-msg.sample ...

输出如下所示:

───────┬────────────────────────────────────────────────────────────────────────
       │ File: .git/config
───────┼────────────────────────────────────────────────────────────────────────
   1   │ [core]
   2   │     repositoryformatversion = 0
   3   │     filemode = true
   4   │     bare = false
   5   │     logallrefupdates = true
   6   │ [remote "origin"]
   7   │     url = https://github.com/blah/blah.git
   8   │     fetch = +refs/heads/*:refs/remotes/origin/*
   9   │ [branch "master"]
  10   │     remote = origin
  11   │     merge = refs/heads/master
───────┴────────────────────────────────────────────────────────────────────────
───────┬────────────────────────────────────────────────────────────────────────
       │ File: .git/info/exclude
───────┼────────────────────────────────────────────────────────────────────────
   1   │ # git ls-files --others --exclude-from=.git/info/exclude
   2   │ # Lines that start with '#' are comments.
   3   │ # For a project mostly in C, the following would be a good set of
   4   │ # exclude patterns (uncomment them if you want to use them):
   5   │ # *.[oa]
   6   │ # *~
───────┴────────────────────────────────────────────────────────────────────────
───────┬────────────────────────────────────────────────────────────────────────
       │ File: .git/packed-refs
───────┼────────────────────────────────────────────────────────────────────────
   1   │ # pack-refs with: peeled fully-peeled sorted 
───────┴────────────────────────────────────────────────────────────────────────

在终端中bat还可以对输出进行着色并突出显示语法。

彩色终端输出的屏幕截图

bat显示这样的二进制文件以避免将垃圾打印到屏幕上。

───────┬────────────────────────────────────────────────────────────────────────
       │ File: .git/objects/06/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   <BINARY>
───────┴────────────────────────────────────────────────────────────────────────

二进制检测并不完美,所以有时仍然会出现屏幕垃圾。

───────┬────────────────────────────────────────────────────────────────────────
       │ File: .git/objects/84/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
───────┼────────────────────────────────────────────────────────────────────────
   1   │ x^A+)Q130040a50UMJ(I-.�-(�,K,I�-I�-�^A2�*^Sss^X��:r^V�o��yAP&�}ّ��͇^A�/
───────┴────────────────────────────────────────────────────────────────────────

您可以通过添加选项和来使bat的输出更加或更少花哨。有关详细信息,请查看手册页或 GitHub 上的 README。--style--color


1:在 Ubuntu 20 上,调用了该包,bat但调用了该命令来batcat解决与另一个名为 的命令的冲突bat

相关内容