特定のファイルのリストを除いて、ファイル名がパターンと一致するファイルに対してコマンドを実行します。

特定のファイルのリストを除いて、ファイル名がパターンと一致するファイルに対してコマンドを実行します。

次のスクリプトは、.texディレクトリ内のサフィックスを含むファイル(TeXファイルなど)を検索し、\RequireLuaTeXそのディレクトリ内の文字列(LuaTeXファイルなど)を検索し、結果に基づいてBash配列を作成します。

latexmk次に、配列内のファイルに対してコマンドを実行します。

配列として宣言できるカスタムファイルのリストをこの配列から除外したいと思います。

excludedfiles=(foo.tex bar.tex baz.tex)

きちんとしたアプローチについてのアドバイスを求めたいと思います。

私はすべてを配列に入れる方法が本当に好きです。まず、コマンドを実行する前にファイルのリストを簡単に一覧表示できます。しかし、私は他のアプローチも考えてみたいと思います。

#!/bin/bash                                
## Get LuaTeX filenames     
mapfile -t -d "" filenames < <(grep -Z -rL "\RequireLuaTeX" *.tex)

## Run `latexmk` on PDFTeX files.
for filename in "${filenames[@]}"
do
    base="${filename%.*}"
    rm -f "$base".pdf
    latexmk -pdf -shell-escape -interaction=nonstopmode  "$base".tex
done

背景と説明:

TeXユーザーは私の質問に混乱する可能性があります。それで、ここで私がやろうとしていることと質問をどのように誤って書いたかを説明します。変更すると既存の回答が無効になり、混乱が生じる可能性があるので変更しません。

LaTeXファイルセットがあります。以前のバージョンはPDFLaTeXを使用していました。最新バージョンはほとんどPDFLaTeXを使用しています。 PDFLaTeXに関する質問です。私がスクリプトでやりたいことは

a) PDFLaTeX ファイルのリストを作成します。私のLuaLaTeXファイルには「\RequireLuaTeX」文字列が含まれています。したがって、この文字列を含まないファイルはPDFLaTeXファイルです。

そのため、文字列 "\RequireLuaTeX"を含まないLaTeXファイルのリストを作成しようとしています。

b)を使用してPDFLaTeXを実行しますlatexmk

私の質問には次のエラーがあります。私は書いた:

次のスクリプトは、.texディレクトリ内のサフィックスを含むファイル(TeXファイルなど)を検索し、\RequireLuaTeXそのディレクトリ内の文字列(LuaTeXファイルなど)を検索し、結果に基づいてBash配列を作成します。

実際、私はこの文字列を含まないファイルが欲しいです。上記のように、これらのファイルは私のPDFLaTeXファイルに対応しているからです。

ベストアンサー1

-Lパターンと一致しない Grep ファイルのリストを表示します。あなたは代わりに欲しいです-l。さらに、Grepは単一のバックスラッシュと一致するようにデュアルバックスラッシュを確認する必要があります。

それではBashを使っているので、いくつかの便利な設定を習得しましょう。

#!/bin/bash -
shopt -s globstar extglob
mapfile -t -d "" filenames < <(grep -Zl '\\RequireLuaTeX' ./**/!(foo|bar|baz).tex)
rm -f "${filenames[@]/%.tex/.pdf}"
latexmk -pdf -shell-escape -interaction=nonstopmode "${filenames[@]}"
  • **/!(foo|bar|baz).tex現在のディレクトリツリーでは、orで終わりますが、.texデフォルト名ではないすべてのファイルに展開されますfoo.tex。両方bar.texbaz.texglobstarそしてextglobこれに必要です。

  • "${filenames[@]/%.tex/.pdf}"配列内のすべての要素に展開され、各要素を置き換えます。続く .tex合格.pdf

Latexmkは複数のファイルをパラメータとして提供できるため、forループをスキップできます。

おすすめ記事