Je voudrais convertir le code source de quelques projets en un seul fichier imprimable pour économiser sur un usb et l’imprimer facilement plus tard. Comment puis je faire ça?
Tout d'abord, je tiens à préciser que je souhaite uniquement imprimer les fichiers et les répertoires non cachés (donc, aucun contenu de .git
par exemple).
Pour obtenir une liste de tous les fichiers non cachés situés dans des répertoires non cachés du répertoire en cours , vous pouvez exécuter la commande find . -type f ! -regex ".*/\..*" ! -name ".*"
comme indiqué dans la réponse - ce fil .
Comme suggéré dans ce même fil, j'ai essayé de créer un fichier pdf à l'aide de la commande find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf
mais malheureusement, le fichier pdf résultant est un désordre total .
Votre question m'a intriguée et je me suis laissé emporter. Cette solution générera un fichier Nice PDF avec un index cliquable et un code en couleur. Il trouvera tous les fichiers dans le répertoire et les sous-répertoires actuels et créera une section dans le fichier PDF (voir les notes ci-dessous pour savoir comment rendre votre commande de recherche plus spécifique).
Vous devez avoir les éléments suivants installés (les instructions d’installation concernent les systèmes Debian, mais elles devraient être disponibles dans les dépôts de votre distribution):
Sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
Cela devrait également installer un système LaTeX de base si vous n'en avez pas installé.
Une fois ceux-ci installés, utilisez ce script pour créer un document LaTeX avec votre code source. Le truc consiste à utiliser listings
(partie de texlive-latex-recommended
) et color
( installé par latex-xcolor
) packages LaTeX. Le \usepackage[..]{hyperref}
est ce qui rend les listes dans la table des matières des liens cliquables.
#!/usr/bin/env bash
tex_file=$(mktemp) ## Random temp file name
cat<<EOF >$tex_file ## Print the tex file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color} %% Allow color names
\lstdefinestyle{customasm}{
belowcaptionskip=1\baselineskip,
xleftmargin=\parindent,
language=C++, %% Change this to whatever you write in
breaklines=true, %% Wrap long lines
basicstyle=\footnotesize\ttfamily,
commentstyle=\itshape\color{Gray},
stringstyle=\color{Black},
keywordstyle=\bfseries\color{OliveGreen},
identifierstyle=\color{blue},
xleftmargin=-8em,
}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\begin{document}
\tableofcontents
EOF
find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' | ## Change ./foo/bar.src to foo/bar.src
while read i; do ## Loop through each file
name=${i//_/\\_} ## escape underscores
echo "\newpage" >> $tex_file ## start each section on a new page
echo "\section{$i}" >> $tex_file ## Create a section for each filename
## This command will include the file in the PDF
echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . &&
pdflatex $tex_file -output-directory . ## This needs to be run twice
## for the TOC to be generated
Exécutez le script dans le répertoire contenant les fichiers source
bash src2pdf
Cela créera un fichier appelé all.pdf
dans le répertoire en cours. J'ai essayé cela avec quelques fichiers de source aléatoires trouvés sur mon système (en particulier deux fichiers de la source de vlc-2.0.0
). Voici une capture d'écran des deux premières pages du fichier PDF obtenu:
Quelques commentaires:
! -name "*~"
pour éviter les fichiers de sauvegarde.Je vous recommande cependant d'utiliser une commande plus spécifique find
pour rechercher vos fichiers, sinon tout fichier aléatoire sera inclus dans le fichier PDF. Si vos fichiers ont tous des extensions spécifiques (.c
et .h
par exemple), vous devez remplacer le find
dans le script par quelque chose comme ceci
find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
listings
, vous pouvez modifier ce paramètre pour qu'il soit exactement comme vous le souhaitez.Je sais que je suis trop tard, mais quelqu'un qui cherche une solution peut trouver cela utile.
Sur la base de la réponse de @ terdon, j'ai créé un script BASH qui fait le travail: https://github.com/eljuanchosf/source-code-to-pdf
(de StackOverflow )
for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt
Cela donnera un résultat.txt contenant:
Si votre code source a une extension différente, modifiez-le si nécessaire. Vous pouvez également modifier le bit d'écho pour ajouter les informations nécessaires (par exemple, echo "nomfichier $ 1" ou modifier le séparateur, ou ajouter un séparateur de fin de fichier).
le lien a d'autres méthodes, alors utilisez la méthode que vous préférez. Je trouve que celui-ci est le plus flexible, même s'il comporte une légère courbe d'apprentissage.
Le code fonctionnera parfaitement à partir d'un terminal bash (juste testé sur un VirtualBox Ubuntu)
Si vous ne vous souciez pas du nom de fichier et du contenu des fichiers fusionnés:
cat *.src > result.txt
fonctionnera parfaitement bien.
Une autre méthode suggérée était:
grep "" *.src > result.txt
Ce qui préfixera chaque ligne du nom de fichier, ce qui peut être bon pour certaines personnes, personnellement, je le trouve trop d’informations, d’où ma première suggestion: la boucle for ci-dessus.
Nous remercions les membres du forum StackOverflow.
EDIT: Je viens de me rendre compte que vous recherchiez spécifiquement HTML ou PDF, comme solution finale. Certaines solutions que j’ai déjà vues sont d’imprimer le fichier texte en PostScript, puis de convertir le format postscript en PDF. Un code que j'ai vu:
groff -Tps result.txt > res.ps
puis
ps2pdf res.ps res.pdf
(Vous devez avoir ghostscript)
J'espère que cela t'aides.