Iterieren durch ein Verzeichnis mit Ant
Frage
Lassen Sie uns sagen, ich habe eine Sammlung von PDF-Dateien mit den folgenden Pfaden:
/some/path/pdfs/birds/duck.pdf
/some/path/pdfs/birds/goose.pdf
/some/path/pdfs/insects/fly.pdf
/some/path/pdfs/insects/mosquito.pdf
Was Ich mag würde zu heißt Thumbnails für jede PDF generieren tun, die die relative Pfadstruktur achten und Ausgang an einem anderen Ort, das heißt:.
/another/path/thumbnails/birds/duck.png
/another/path/thumbnails/birds/goose.png
/another/path/thumbnails/insects/fly.png
/another/path/thumbnails/insects/mosquito.png
Ich möchte dies in Ant getan werden. Angenommen, ich werde Ghost auf der Kommandozeile verwenden, und ich habe bereits aus dem Aufruf von GS gearbeitet:
<exec executable="${ghostscript.executable.name}">
<arg value="-q"/>
<arg value="-r72"/>
<arg value="-sDEVICE=png16m"/>
<arg value="-sOutputFile=${thumbnail.image.path}"/>
<arg value="${input.pdf.path}"/>
</exec>
Also, was ich tun muß, ist Arbeit der richtigen Werte für ${thumbnail.image.path}
und ${input.pdf.path}
während des PDF-Eingabeverzeichnis durchquert.
Ich habe Zugang zu ant-contrib (nur die „neuesten“ installiert, die 1.0b3 ist) und ich bin mit Ant 1.8.0. Ich glaube, ich kann etwas Arbeit mit der <for>
Aufgabe, <fileset>
s und <mapper>
s machen, aber ich habe Probleme setzen sie alle zusammen.
Ich habe versucht, so etwas wie:
<for param="file">
<path>
<fileset dir="${some.dir.path}/pdfs">
<include name="**/*.pdf"/>
</fileset>
</path>
<sequential>
<echo message="@{file}"/>
</sequential>
</for>
Aber leider ist die @{file}
Eigenschaft ist ein absoluter Pfad, und ich kann nicht auf einfache Weise finden sie in die jeweiligen Komponenten zu zersetzen.
Wenn ich das mit einer benutzerdefinierten Aufgabe nur tun kann, ich denke, ich eine schreiben konnte, aber ich hoffe, ich kann einfach zusammen bestehende Komponenten anschließen.
Lösung
In der sequentiellen Aufgabe könnten Sie möglicherweise in der Lage sein, den ant-contrib propertyregex Aufgabe, die Eingangspfade zur Ausgabe abzubilden. Zum Beispiel:
<propertyregex override="yes" property="outfile" input="@{file}"
regexp="/some/path/pdfs/(.*).pdf"
replace="/another/path/\1.png" />
Welche Karten, zum Beispiel /some/path/pdfs/birds/duck.pdf
zu /another/path/birds/duck.png
.
Andere Tipps
Aus Gründen der Vollständigkeit, hier ist, was ich mit für ein Ziel kam basierend auf Antwort des martin clayton. Es funktioniert nur unter Windows für jetzt, aber das ist, weil ich nicht auf die Installation von Ghostscript in einem nicht-Proxy-Art und Weise noch auf Mac OS X. Hinweis bekommen haben um, dass eine plattformübergreifende Lösung, die ich zu „schrubben“ sein musste die Datei Separatoren sein konsequent zukunfts slash nur.
<target name="make-thumbnails" depends="">
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="/path/to/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<condition property="ghostscript.executable.name" value="/path/to/gswin32c.exe">
<os family="windows"/>
</condition>
<condition property="ghostscript.executable.name" value="">
<os family="mac"/>
</condition>
<for param="file">
<path>
<fileset dir="/path/to/pdfs">
<include name="**/*.pdf"/>
</fileset>
</path>
<sequential>
<propertyregex override="yes" property="file-scrubbed" input="@{file}"
regexp="\\"
replace="/" />
<propertyregex override="yes" property="output-path-directory-fragment" input="${file-scrubbed}"
regexp=".*/pdfs/(.*)/.+\.pdf"
replace="\1" />
<propertyregex override="yes" property="output-path-file-fragment" input="${file-scrubbed}"
regexp=".*/pdfs.*/(.+)\.pdf"
replace="\1.png" />
<mkdir dir="${thumbnails.base.dir}/${output-path-directory-fragment}"/>
<exec executable="${ghostscript.executable.name}">
<arg value="-q"/>
<arg value="-dLastPage=1"/>
<arg value="-dNOPAUSE"/>
<arg value="-dBATCH"/>
<arg value="-dSAFER"/>
<arg value="-r72"/>
<arg value="-sDEVICE=png16m"/>
<arg value="-sOutputFile=${thumbnails.base.dir}/${output-path-directory-fragment}/${output-path-file-fragment}"/>
<arg value="${file-scrubbed}"/>
</exec>
</sequential>
</for>
</target>