Shellscript para imprimir uma árvore de diretórios e o conteúdo dos arquivos com uma apresentação agradável

4

Eu estou tentando escrever um shellscript que imprime uma visão em árvore para um diretório específico e é subdiretório para pdf via latex, assim como os títulos e conteúdos de todos os scripts contidos naquele diretório primário.

A treeview funciona como um encanto, mas não tenho ideia de como fazer com que a impressão dos scripts funcione.

Código até agora:

#!/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
    
por viraxis 13.12.2012 / 08:03

2 respostas

3

Árvore de diretórios de impressão e conteúdo de arquivos de script muito

Editar : versão mais recente com tabela completa de conteúdo como suporte a árvore e imagem, na segunda parte.

Usando \verbatiminput do pacote verbatim .

Assim:

#!/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}"

Quem produziria esse tipo de saída:

Árvoredediretóriosdeimpressãobonitacomtabeladeconteúdo,scriptsearquivosdeimagens.

NOTA:Paracomputartoc,latextemqueserexecutadoduasvezes.

bugs:

Estescriptéapenasumaprovadeconceito,otipodeimagenséprovavelmentelimitadoepodesermelhorado,eventualmentecomaajudadeimagemagik,netpbmouqualquerlibgráfico...eassimpordiante

todo:

  • corrigirdimensõesdeimagens
  • melhorarafiltragemdeimagens
  • adicionesuporteparapdf,psetalvezoutrosimprimíveis,como.man,.tex,.sgml,.odf
    • adicionaropçãoparaimprimiraprimeirapáginadosarquivosdedocumentos.
  • crieeelimineficheirostemporáriosdeformamaisadequada.

Láestá:

#!/bin/bashtempfile=$(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}"

Pode produzir:

    
por 12.01.2013 / 19:24
0

Não está exatamente claro para mim o que você quer, mas pelo que entendi, você quer ter a saída de todos os arquivos .sh impressos em tmp.tex. Então você poderia fazer algo como

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

Que concatenam todos os arquivos .sh e os adicionam a tmp.tex .

    
por 13.12.2012 / 08:12