Показать дерево каталогов с содержимым файлов
Я хотел бы распечатать в терминале дерева, как показано ниже:
$ 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.

