找到需要更新的所有文件

时间:2012-10-03 23:49:59

标签: bash for-loop

我使用下面的脚本将目录中的所有pdf文件转换为png文件,我只想在尚未转换的文件上运行它。

#!/bin/bash
# Convert pdf to png
for f in *.pdf
do
    echo "Converting $f"
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="png/$f.png" "$f"
done
rename -f 's/\.pdf\.png/\.png/' png/*.pdf.png

如何修改循环,使其仅限于相应的png文件不存在或比pdf文件旧的文件?

1 个答案:

答案 0 :(得分:3)

对您的脚本进行简单修改:

#!/bin/bash
# Convert pdf to png
for f in *.pdf
do
    png="png/${f%pdf}png"
    if [ -e "$png" -a "$f" -nt "$png" ]; then
        continue
    fi

    echo "Converting $f"
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="$png" "$f"
done

首先,我们使用就地编辑创建$png变量。基本上%pdf告诉bash删除最后一次出现的pdf,这是扩展名。然后我们可以将它放在一个字符串中,并在其前面添加png/并添加png扩展名。这为您节省了最后一次重命名命令。

现在我们有一个if语句,如果满足某个条件,continue是循环。继续意味着转到循环的下一次迭代,而不执行此迭代的任何其他操作。条件是“$ png”存在(-e "$png")和(-a)“$ f”比“$ png”("$f" -nt "$png")更新。

但我建议写一个Makefile:

PDFS := $(wildcard *.pdf)
PNGS := $(addprefix png/,$(PDFS:.pdf=.png))
all: $(PNGS)
png/%.png: %.pdf
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="$@" "$<"

只要您想要生成较新的PNG,就可以使用make运行它。