[英]SHELL - Deleting files under home directory and its sub-directories in a single command line
[英]How to make a single makefile that applies the same command to sub-directories?
為了清楚起見,我在Windows上使用GnuWin32 make
運行它。
我有一組目錄,其中的markdown文件位於幾個不同的級別上-理論上它們可以在分支節點中,但是我認為當前它們僅在葉節點中。 我有一組pandoc / LaTeX命令可以運行,以將markdown文件轉換為PDF-顯然,僅當markdown文件已更新時才想重新創建PDF,因此makefile
似乎合適。
我想要的是根目錄中的單個makefile
,它遍歷所有子目錄(至任何深度)並應用我將為運行pandoc指定的make規則。
根據我的發現, recursive makefiles
要求您在每個子目錄中都有一個makefile
(這似乎是我要避免的管理開銷)和/或要求您列出所有子目錄在makefile
的開頭(再次,寧願避免這種情況)。
理論文件夾結構:
root
|-make
|-Folder AB
| |-File1.md
| \-File2.md
|-Folder C
| \-File3.md
\-Folder D
|-Folder E
| \-File4.md
|-Folder F
\-File5.md
如何編寫一個makefile來處理這種情況?
這是一小套Makefile規則,希望它們能助您一臂之力
%.pdf : %.md
pandoc -o $@ --pdf-engine=xelatex $^
PDF_FILES=FolderA/File1.pdf FolderA/File2.pdf \
FolderC/File3.pdf FolderD/FolderE/File4.pdf FolderD/FolderF/File5.pdf
all: ${PDF_FILES}
讓我解釋一下這是怎么回事。 首先,我們有一個模式規則,該規則告訴make如何將Markdown文件轉換為PDF文件。 --pdf-engine=xelatex
選項僅在此處用於說明目的。
然后,我們需要告訴Make要考慮哪些文件。 我們將名稱放到單個變量PDF_FILES
。 可以通過掃描所有子目錄中的.md
文件的單獨腳本來構建此變量的此值。
請注意 ,如果文件名或目錄名稱包含空格,則必須格外小心。
然后,我們要求Make檢查是否應更新任何PDF_FILES
。
如果您的makefile中還有其他目標,請確保all
是第一個非模式目標,或將make稱為make all
如果shell
函數對您有用,並且sed和find等基本實用程序可用,則可以使一行的makefile動態化。
%.pdf : %.md
pandoc -o $@ --pdf-engine=xelatex $^
PDF_FILES:=$(shell find -name "*.md" | xargs echo | sed 's/\.md/\.pdf/g' )
all: ${PDF_FILES}
MadScientist在評論中建議
否則,您可以使用操作系統上可用的工具來實現腳本,並添加其他目標update:
它將計算文件列表,並將以PDF_FILES
開頭的行替換為更新的文件列表。
基於@DmitiChubarov和@MadScientist的建議,適用於Windows的代碼的最終版本如下:
%.pdf: %.md
pandoc $^ -o $@
PDF_FILES:=$(shell dir /s /b *.md | sed "s/\.md/\.pdf/g")
all: ${PDF_FILES}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.