2012-04-13 37 views
2

当我在写一个乳胶文件只保留一个,有时我需要删除这是由它的编译和生成的所有文件只保留.tex文件。例如,我想删除所有的以下文件:不同的扩展删除所有文件,并使用bash正则表达式

paper-stack.log 
paper-stack.blg 
paper-stack.bbl 
paper-stack.aux 
paper-stack.pdf 

,并保持以下文件:

paper-stack.tex 

除此之外,我想用bash regexp删除。我记得之前做过,但现在我对使用其他shell后的正则表达式模式感到困惑。这是类似于rm paper-stack.[!tex],但我不确定元字符[]!

+0

将规则添加到'Makefile''clean'目标不是一件容易的事情,因此您可以使用一条命令可靠地将它们全部移除几千次以上吗? – sarnold 2012-04-13 01:37:25

+0

是的,会的。我想我应该开始创建'Makefile'来编译Latex文件。无论如何,我对这个命令非常感兴趣,因为它对于其他命令来说似乎非常简单而且非常有用。对bash的力量更是一种好奇心。 – Yamaneko 2012-04-13 01:45:33

+0

@sarnold恕我直言,创建一个Makefile对我来说似乎不是很实际,比如在** Emacs **中编辑和编译Latex,并使用这个单一命令删除上述文件。我想可能是为了更大的项目。 – Yamaneko 2012-04-13 01:49:23

回答

3

如果你已经做了shopt extglob那么你可以这样说

rm paper-stack.!(tex) 

(像往常一样与rm或其他潜在的破坏性命令工作时,它与echo首先要考个好主意。)我会更明确要删除什么,只是基于一般原则。

+1

请注意,这可能会破坏你的'。bib'文件,不能从'.tex'文件重新创建。是的,你加了一个警告,但这是极其危险的。 :) – sarnold 2012-04-13 01:48:48

+0

你是对的!谢谢@sarnold和@geekosaur。当你编辑你的Latex文件时,你是否通常用'clean'和其他目标创建'Makefile'? – Yamaneko 2012-04-13 02:00:03

+0

是的;不仅仅是出于这个原因,而是因为有时你需要多次运行才能解决所有问题,并且需要更新反向引用等。 – geekosaur 2012-04-13 02:01:36

1

我认为你可以使用命令查找到你想要的目录并将其删除。像下面这样。但考虑一下sarnold的建议,把命令放在makefile文件的某个地方。

find my/dir/ -name "*.log" -or -name ".aux" -exec rm '{}' \; 
2

一个创建Makefile的漂亮点的是,它可以在必要时运行的LaTeX多次协助;这是从生产Makefile,保持技术文件上最新拍摄:

techdoc.pdf: techdoc.tex 
     while pdflatex $< ${BUILD_OUTPUT} || exit 1 ; \ 
       grep -q "Label(s) may have changed" techdoc.log; \ 
     do :; done 

这样,只是运行make(如果这是在Makefile第一目标)将重建techdoc.pdf多次这是确保参考和标签正确更新所必需的。 (这通常只是两次,有时可能是三次,我听说有人巧妙地可以使得像这样的循环的输入永不终止 - 但我从来没有看到过。)

一旦你得到了这样的事情在发生,这是小菜一碟继续下去:

.PHONY: clean 

clean: techdoc.log techdoc.bbl techdoc.aux techdoc.blg 
     rm $? 

http://www.gnu.org/software/make/manual/make.html#Special-Variables解释$?[email protected],以及类似的短手GNU可用的变量制作。

+0

太棒了!很有用。我将开始使用'Makefile'。我曾经发现它很烦人,因为我必须从一开始就创建一个新的'Makefile',并逐个创建所有规则。我相信这是缺乏练习。学习后,会带来更多的长期收益。 – Yamaneko 2012-04-13 02:31:57

+0

不要忘记,您必须用_tabs_和_only_选项卡缩进所有行。这一定是'make'中最恼人的一个方面,每个初学者都至少讨厌一次。 :) – sarnold 2012-04-13 02:41:12