0

以下のスクリプトを使用して、ディレクトリ内のすべての 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ファイルよりも古いファイルに制限されるようにループを変更するにはどうすればよいですか?

4

1 に答える 1

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="$@" "$<"

そして、make新しい PNG を生成したいときはいつでも実行してください。

于 2012-10-03T23:58:11.007 に答える