Показать дерево каталогов с содержимым файлов
Я хотел бы распечатать в терминале дерева, как показано ниже:
$ 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 |
Есть ли простой способ достичь этого?
1 ответ
Решение
Я не знаю простой способ сделать это, но я написал сценарий, который делает что-то подобное. Вместо причудливого списка деревьев, как 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
Скриншот: