根据正则表达式列出目录中带有扩展名的所有文件

根据正则表达式列出目录中带有扩展名的所有文件

是否有一种真正复杂的方法可以将名称符合特定条件的所有文件(例如所有.cpp、.h 文件)包含在给定的目录路径中?

\documentclass{article}
\begin{document}    
    \lstAllFromDirectory{directory}{*.cpp *.h}
\end{document}

我应该使用什么方法才能获得这样的结果?

答案1

使用平台独立方法texosquery(需要 Java):

\documentclass{article}

\usepackage{texosquery}

\begin{document}

\TeXOSQueryFilterFileList{\result}{,}{.*\string\.(cpp|h)}{.}

\makeatletter
\ifx\result\empty
 Query Failed!
\else
\@for\thisfile:=\result\do{%
  File: \texttt{\thisfile}.\par
}
\fi
\makeatother

\end{document}

它需要 shell 转义。如果调用该文件,test.tex则:

pdflatex -shell-escape test

使用 MikTeX,您还需要启用管道 shell 转义(--enable-pipes)。

有三种变体texosquery

  1. texosquery-jre5:至少需要 Java 5,但没有完整的功能并且安全性较低;
  2. texosquery(默认):至少需要 Java 7,具有几乎全套功能,但某些文件操作有限制;
  3. texosquery-jre8:至少需要 Java 8,具有全套功能,但某些文件操作有限制,现在已列入 TeX Live 的可信应用程序列表中。

因此,如果您拥有 Java 8 并且texosquery-jre8在限制列表中(针对 TL2017),那么您可以使用受限 shell 转义。

要从默认切换texosquerytexosquery-jre8,您需要编辑文件texosquery.cfg。最简单的方法是将安装的复制texosquery.cfg到本地或主 TEXMF 树并从那里进行编辑。这样,在更新发行版时它就不会被覆盖。

设置\TeXOSInvokerName为所需的应用程序:

\def\TeXOSInvokerName{texosquery-jre8}

取消注释以下行以允许应用程序在受限模式下运行:

\TeXOSQueryAllowRestricted

(仅当应用程序确实在限制列表中时才执行此操作。)现在您可以执行此操作(使用 TeX Live):

pdflatex test

或者使用 MikTeX:

pdflatex --enable-pipes test

也适用于纯 eTeX:

\input texosquery

\TeXOSQueryFilterFileList{\result}{,}{.*\string\.(cpp|h)}{.}    

\ifx\result\empty
 Query Failed!
\else
 % iterate over comma-separated list stored in \result using your preferred method
\fi

\bye

相关内容