ディレクトリ内のすべてのファイル名を含むtexファイルを生成します。

ディレクトリ内のすべてのファイル名を含むtexファイルを生成します。

95個のtexファイルを含むフォルダがあります。次のコードを含む all.tex tex ファイルを作成する必要があります。

\documentclass[10pt]{article}
\begin{document}
\input{file1.tex}
\input{file2.tex}
...
\input{file95.tex}
\end{document}

ファイル名はこれですいいえパターンがあるためループは使用できません。上記は単なる実例です。

Bashで次のことを試しました。

printf '%s\n' *.tex | paste -sd "\n" - > all.tex

これにより、次の all.tex ファイルが生成されます。

file1.tex
file2.tex
...
file95.tex

ファイル名の周囲に\ input {}を追加するにはどうすればよいですか?序文などをどのように追加しますか?

使っていますバッシュ(Ubuntuから)Windows 10で。

答え1

単純なシェルスクリプトはprintf単純なワイルドカード拡張を使用します。

#!/bin/sh

printf '%s\n' '\documentclass[10pt]{article}' \
              '\begin{document}'

printf '\input{%s}\n' *.tex

printf '%s\n' '\end{document}'

スクリプトを呼び出して出力をリダイレクトできます。たとえば、次のようになります。

/path/to/script > /path/of/output.tex

単一のコマンドラインから単一のリダイレクト用に印刷物をグループ化できます。

{ printf '%s\n' '\documentclass[10pt]{article}' \
              '\begin{document}'
printf '\input{%s}\n' *.tex
printf '%s\n' '\end{document}'
} > /path/of/output.tex

答え2

おそらく最高ではありませんが、ファイルsedを編集するためのall.texソリューションは次のとおりです。

sed -e 's/^/\\input\{/g' -e 's/$/\}/g' all.tex

答え3

通常のUbuntuにはデフォルトでPerlがインストールされているので、次のことができます。

ls *tex | perl -pne 's/(.*)/\\input{$1}/' > allfiles.tex

まだWindowsのUbuntuにインストールされていない可能性があります。だとしたらapt-get install perl-base大丈夫です。

編集する:Perlが利用できず、インストールしたくない場合は、sedを使用することもできます。

ls *tex | sed 's/\(.*tex\)/\\input{\1}/' > allfiles.tex

(しかし私はいつもより強力なPerlをお勧めします)

答え4

GNUの使用awk:

awk '
    BEGIN     { print "\\documentclass[10pt]{article}"
                print "\\begin{document}" }
    BEGINFILE { printf("\\include{%s}\n", FILENAME); nextfile }
    END       { print "\\end{document}" }' *.tex

これにより、表示されたリストと同じリストが生成されます。このファイルは、シェルの拡張ファイル名のワイルドカードパターン順に一覧表示されます*.tex

file1.tex名前が to のファイルの場合、file95.texこれは次のようになります。いいえ番号順に。これを行うには、シェルに切り替えてglobbingモードまたはより快適なモードをzsh使用する必要があります。file<1-95>.tex*.tex(n)

関連情報