いくつかのプロジェクトのソースコードを1つの印刷可能なファイルに変換して、USBに保存し、後で簡単に印刷したいと考えています。どうやってやるの?
最初に、非表示ではないファイルとディレクトリのみを印刷することを明確にしたいと思います(つまり、.git
の内容はありません)。
現在のディレクトリ内の非表示でないディレクトリにあるすべての非表示でないファイルのリストを取得するには、 this thread の回答として表示されるfind . -type f ! -regex ".*/\..*" ! -name ".*"
コマンドを実行できます。
同じスレッドで示唆されているように、find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf
コマンドを使用してファイルのpdfファイルを作成しようとしましたが、残念ながら結果のpdfファイルは完全に混乱していますです。
私はあなたの質問に興味をそそられ、ちょっと夢中になりました。このソリューションは、ニース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{$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
ソースファイルを含むディレクトリでスクリプトを実行します
bash src2pdf
これにより、現在のディレクトリにall.pdf
というファイルが作成されます。私が自分のシステムで見つけたランダムなソースファイル(具体的には、vlc-2.0.0
のソースからの2つのファイル)でこれを試しました。これは、結果のPDFの最初の2ページのスクリーンショットです。
いくつかのコメント:
! -name "*~"
を追加しました。ただし、より具体的なfind
コマンドを使用してファイルを見つけることをお勧めします。そうしないと、ランダムファイルがPDFに含まれます。すべてのファイルに特定の拡張子(たとえば、.c
および.h
)がある場合、スクリプトのfind
を次のようなものに置き換える必要があります
find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
listings
options をいじってみてください。これを好きなように微調整できます。私は手遅れだと知っていますが、解決策を探している誰かがこれが役立つと思うかもしれません。
@terdonの答えに基づいて、私は仕事をするBASHスクリプトを作成しました: https://github.com/eljuanchosf/source-code-to-pdf
(- StackOverflow から)
for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt
これにより、以下を含むresult.txtが生成されます。
ソースコードの拡張子が異なる場合は、必要に応じて変更してください。エコービットを編集して必要な情報を追加することもできます(「ファイル名$ 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が必要です)
お役に立てれば。