Показать дерево каталогов с содержимым файлов

Я хотел бы распечатать в терминале дерева, как показано ниже:

$ tree -a,
G──.git
    Branches── ветви
    Config── конфиг
    Description── описание
    HE── ГОЛОВА
    Hook── крючки
    Apply ├── applypatch-msg.sample
    Commit ├── commit-msg.sample
    S ├── fsmonitor-watchman.sample
    Post ├── post-update.sample
    -├── pre-applypatch.sample
    -├── pre-commit.sample
    Prepare ├── prepare-commit-msg.sample
    Pre ├── pre-push.sample
    Pre ├── pre-rebase.sample
    Pre ├── pre-receive.sample
    Update └── update.sample
    Info── информация
    Exc └── исключить
    Objects── объекты
    Info ├── информация
    Pack
    └── пакет
    Ref── refs
        Heads── головы
        Tags── метки

С графически представленным содержимым всех файлов т.е. должно как соответственно?

,
G──.git
    Branches── ветви
    Config── конфиг
    |
    |   [Ядро]
    |        repositoryformatversion = 0
    |        filemode = true
    | голый = ложный
    |        logallrefupdates = true
    |
    Description── описание
    |
    | Безымянный репозиторий; отредактируйте этот файл 'description', чтобы назвать хранилище.
    |
    HE── ГОЛОВА
    |
    | Ref: Refs/ Heads/ Master
    |

Есть ли простой способ достичь этого?

2 ответа

Решение

Я не знаю простой способ сделать это, но я написал сценарий, который делает что-то подобное. Вместо причудливого списка деревьев, как tree делает, я сделал это плоским, как find,

Вывод (в пустом репозитории Git, как в вашем примере):

.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/

...

(The ==> ... <== верхний / нижний колонтитул вдохновлен 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

Скриншот:

Как и решение wjandrea , это решение также сглаживает дерево для получения выходных данных.

Сначала установите " catклон с крыльями» . 1

      sudo apt install bat

Теперь решение представляет собой однострочное решение с использованием команды.findпредустановлен как часть GNU findutils.

      find -type f -exec batcat {} +

The 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 
───────┴────────────────────────────────────────────────────────────────────────

В терминале также раскрашивается вывод и выделяется синтаксис.

`batp показывает такой двоичный файл, чтобы избежать вывода мусора на экран.

      ───────┬────────────────────────────────────────────────────────────────────────
       │ 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�/
───────┴────────────────────────────────────────────────────────────────────────

Вы можете сделать вывод более или менее необычным, добавив опции--styleи--color. Подробности можно найти на странице руководства или в README на GitHub.


1: В Ubuntu 20 вызывается пакет, но вызывается командаbatcatчтобы разрешить конфликт с другой командой под названиемbat.

Другие вопросы по тегам