Shellscript 以精美的演示方式打印目录树和文件内容

Shellscript 以精美的演示方式打印目录树和文件内容

我正在尝试编写一个 shellscript,它通过 Latex 打印特定目录的树视图及其 pdf 的子目录,以及该主目录中包含的所有脚本的标题和内容。

树视图的工作方式就像一个魅力,但我不知道如何让脚本的打印工作。

到目前为止的代码:

#!/bin/bash

# Script to export directory with pdflatex

# Generate .tex file
# Directory Listing
echo "\documentclass[11pt,a4paper,oneside]{article}" > tmp.tex
echo "\usepackage{fullpage}" >> tmp.tex
echo "\begin{document}" >> tmp.tex
echo "\section{Listing}" >> tmp.tex
echo "\begin{verbatim}" >> tmp.tex
tree $1 >> tmp.tex
echo "\end{verbatim}" >> tmp.tex
echo "\end{document}" >> tmp.tex

# ShellScript printout
???????

# Generate .pdf file
pdflatex tmp.tex

#Cleanup
rm tmp.tex

答案1

漂亮打印目录树和脚本文件内容

编辑:较新的版本,具有完整的目录作为树和图片支持,在第二部分。

\verbatiminput从包中使用逐字

像这样:

#!/bin/bash

tempfile=$(mktemp /tmp/dirtree-XXXXX.tex)
trap "rm $tempfile" 0 1 2 3 6 9 15

cat <<EOF >$tempfile
\documentclass[11pt,a4paper,oneside]{article}
\usepackage{fullpage,verbatim,dirtree}
\begin{document}
\section{Listing}
\dirtree{%
EOF

export -a scriptList=()
while IFS=/ read -a fPath ;do
    file="${fPath[*]:${#fPath[*]}-1}"
    IFS=/
    full="${fPath[*]}"
    type="$(file -b "$full")"
    echo .${#fPath[@]} "${file//_/\\_}\DTcomment{$type}. "
    [[ "$type" =~ script.text ]] && scriptList=("${scriptList[@]}" "$full")
    done  < <(
    find $1 -type d -o -type f
)  >>$tempfile

export IFS=$'\n\t '
echo "}" >>$tempfile

for file in "${scriptList[@]}";do
    name="${file##*/}"
    printf "\\section{%s}\n{\\\\scriptsize\\\\verbatiminput{%s}}\n" \
    "${name//_/\_}" "${file}"  >>"${tempfile}"    
done

echo >>"${tempfile}" '\end{document}'

pdflatex -interaction nonstopmode "${tempfile}"

谁会产生这种输出:

打印目录内容

漂亮的打印目录树,包含内容表、脚本和图像文件。

注意:用于计算目录latex必须运行两次。

虫子:

这个脚本只是一个概念证明,图像类型可能是有限的,可以改进,最终通过帮助图像魔术师,网络PBM或任何图形库...等等

去做:

  • 修复图像尺寸
  • 改进图像过滤
  • 添加对 pdf、ps 以及其他可打印文件的支持,例如 .man、.tex、.sgml、.odf
    • 添加打印文档文件第一页的选项。
  • 更正确地创建和清除临时文件。

就在那里:

#!/bin/bash

tempfile=$(mktemp /tmp/dirtree-XXXXX.tex)
# trap "rm $tempfile" 0 1 2 3 6 9 15

cat <<EOF >$tempfile
\documentclass[11pt,a4paper,oneside]{article}
\usepackage{fullpage,graphicx,verbatim,dirtree}
\makeatletter
\newcommand{\typePPage}[2]{\DTcomment{{\scriptsize #1
\begin{minipage}[t]{5em}\mbox{}\hfill\ifx\@empty#2\else%
s.$\ref{sec:#2}$, p.$\pageref{sec:#2}$\fi\end{minipage}}}}
\makeatother
\begin{document}\parindent=0pt%
\section{Listing}
\dirtree{%
EOF

export -a scriptList=()
export -A typelist=()
while IFS=/ read -a fPath ;do
    file="${fPath[*]:${#fPath[*]}-1}"
    IFS=/
    full="${fPath[*]}"
    type="$(file -b "$full")"
    if [[ "$type" =~ script.text ]] || [[ "$type" =~ image ]] ;then
    scriptList=("${scriptList[@]}" "$full")
    typelist["${full//\//_}"]="$type"
    echo .${#fPath[@]} \
        "${file//_/\\_}\typePPage{$type}{${file//[\/.+()_-]/}}. "
    else
    echo .${#fPath[@]} "${file//_/\\_}\typePPage{$type}{}. "
    fi
    done  < <(
    find $1 -type d -o -type f
)  >>$tempfile

export IFS=$'\n\t '
echo "}" >>$tempfile

for file in "${scriptList[@]}";do
    name="${file##*/}"
    printf '\\section{%s}\n\\label{sec:%s}\n' \
    "${name//_/\_}" "${name//[\/.+()_-]/}"
    if [[ "${typelist["${file//\//_}"]}" =~ script.text ]];then
    printf '{\\scriptsize\\verbatiminput{%s}}\n' "${file}"
    else
    printf '\\includegraphics[width=\\textwidth]{%s}\n' "${file}"
    fi
done >>"${tempfile}"

echo >>"${tempfile}" '\end{document}'

pdflatex -interaction nonstopmode "${tempfile}" >/dev/null 2>&1
pdflatex -interaction nonstopmode "${tempfile}"

可以产生:

输出样本

答案2

我不太清楚你想要什么,但据我了解,你希望将所有.sh文件的输出打印到 tmp.tex 中。然后你可以做类似的事情

find -name "*.sh" -exec cat "{}" + >> tmp.tex

它连接所有.sh文件,然后将其添加到tmp.tex.

相关内容