我有一个以换行符分隔的文件路径列表,全部为 pdf 文件。我想过滤掉所有*.tex
在同一目录中具有相应文件的文件(因此可以假定是自动生成的)。
例如,如果列表包含foo.tex
, foo.pdf
, bar.pdf
,我希望脚本仅输出bar.pdf
。如果我有foo/foo.tex
和bar/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
关于包含换行符等的值和文件名的常见警告适用,但假设您没有发生任何异常情况,那么一切都会直接进行。