我想将几个项目的源代码转换为一个可打印文件,保存在 USB 上,以后可以轻松打印出来。我该怎么做?
编辑
首先我想澄清一下,我只想打印非隐藏的文件和目录(因此没有.git
例如的内容)。
为了得到当前目录中非隐藏目录中所有非隐藏文件的列表您可以find . -type f ! -regex ".*/\..*" ! -name ".*"
按照以下答案所示运行命令此主题。
正如在同一个线程中所建议的,我尝试使用命令制作文件的 pdf 文件find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf
,但不幸的是生成的 pdf 文件一团糟。
答案1
我对你的问题很感兴趣,有点入迷了。此解决方案将生成一个漂亮的 PDF 文件,其中包含可点击的索引和颜色突出显示的代码。它将查找当前目录和子目录中的所有文件,并在 PDF 文件中为每个文件创建一个部分(请参阅下面的说明,了解如何使 find 命令更具体)。
它要求您安装以下内容(安装说明适用于基于 Debian 的系统,但这些应该在您的发行版的存储库中可用):
-
sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
如果您尚未安装,这还应该安装一个基本的 LaTeX 系统。
安装完成后,使用此脚本用源代码创建 LaTeX 文档。诀窍是使用listings
(部分texlive-latex-recommended
)和color
(由 安装latex-xcolor
)LaTeX 包。这\usepackage[..]{hyperref}
使得目录中的列表成为可点击链接。
#!/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{$name}" >> $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
在包含源文件的目录中运行脚本
bash src2pdf
这将all.pdf
在当前目录中创建一个名为的文件。我尝试使用我在系统上找到的几个随机源文件(具体来说,来自 源的两个文件vlc-2.0.0
)执行此操作,这是生成的 PDF 的前两页的屏幕截图:
一些评论:
如果源代码文件名包含空格,则脚本将无法运行。由于我们讨论的是源代码,因此我假设文件名中不包含空格。
我添加了
! -name "*~"
以避免备份文件。不过,我建议你使用更具体的
find
命令来查找文件,否则任何随机文件都将包含在 PDF 中。如果你的文件都有特定的扩展名(.c
例如.h
),你应该find
用类似这样的命令替换脚本中的find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
尝试一下
listings
选项,您可以对其进行调整,使它完全符合您的要求。
答案2
我知道我来得太晚了,但对于那些正在寻找解决方案的人来说,这很有用。
根据@terdon 的回答,我创建了一个可以完成这项工作的 BASH 脚本:https://github.com/eljuanchosf/source-code-to-pdf
答案3
(从堆栈溢出)
for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt
这将导致 result.txt 包含以下内容:
- 文件名
- 分隔器 ( - -)
- .src 文件的内容
- 从顶部重复,直到完成所有 *.src 文件
如果您的源代码有不同的扩展名,只需根据需要进行更改即可。您还可以编辑 echo 位以添加必要的信息(可能是 echo "filename $1" 或更改分隔符,或添加文件结尾分隔符)。
链接中还有其他方法,因此请使用您最喜欢的方法。我发现这种方法最灵活,尽管它确实需要一点学习时间。
该代码可以从 bash 终端完美运行(刚刚在 VirtualBox Ubuntu 上测试过)
如果您不关心文件名而只关心合并在一起的文件的内容:
cat *.src > result.txt
将会完美运行。
建议的另一种方法是:
grep "" *.src > result.txt
它将在每一行前面加上文件名作为前缀,这对某些人来说可能会很有用,但我个人认为它包含太多信息,因此我的第一个建议是上面的 for 循环。
感谢 StackOverflow 论坛的各位朋友。
编辑:我刚刚意识到您最终想要的是 HTML 或 PDF,我见过的一些解决方案是将文本文件打印成 PostScript,然后将 PostScript 转换为 PDF。我见过的一些代码:
groff -Tps result.txt > res.ps
然后
ps2pdf res.ps res.pdf
(需要您有 ghostscript)
希望这可以帮助。