2012-04-13 18 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