Shell 脚本:过滤 .pdf 文件列表,排除具有 .tex 源文件的文件

Shell 脚本:过滤 .pdf 文件列表,排除具有 .tex 源文件的文件

我有一个以换行符分隔的文件路径列表,全部为 pdf 文件。我想过滤掉所有*.tex在同一目录中具有相应文件的文件(因此可以假定是自动生成的)。

例如,如果列表包含foo.tex, foo.pdf, bar.pdf,我希望脚本仅输出bar.pdf。如果我有foo/foo.texbar/foo.pdf,我希望脚本输出bar/foo.pdf

(用例如中所述这个问题:我有一个 git 存储库,其中包含 tex 文件和外部生成的 pdf 文件。自动生成的 pdf 不应该由 git 跟踪,但其他的应该可以。我想到的解决方案是放入*.pdf,.gitignore但添加一个 git post-commit 挂钩,当存在除从.tex文件生成的 PDF 之外的未跟踪的 pdf 时,该挂钩会向我发出警告。我正在使用 获取未跟踪的 pdf 列表git status --ignored *.pdf,但不确定如何干净地实施下一步。)

答案1

您可以使用常规循环[ -e${xxx%.pdf}检查并构造文件名。这将读取标准输入上的路径,每行一个:

while read path
do
    [ -e "${path%.pdf}.tex" ] || echo "$path"
done

"${path%.pdf}" 扩展到 $path把“.pdf”去掉,然后我们可以直接把“.tex”放在最后。如果它-e存在,那么我们什么也不做,否则 ( ||) 它会打印出 PDF 的路径。如果您愿意,您可以在其中放置更复杂的逻辑和行为。

IFS关于包含换行符等的值和文件名的常见警告适用,但假设您没有发生任何异常情况,那么一切都会直接进行。

相关内容