Ant -Unzip -Aufgabe und nur das Extrahieren von Dateien basierend auf einem anderen Verzeichnis

StackOverflow https://stackoverflow.com/questions/7802142

  •  22-10-2019
  •  | 
  •  

Frage

Ich habe eine ZIP -Datei und separat ein Verzeichnis, das einige Dateien enthält. Aus der ZIP -Datei möchte ich nur diejenigen Dateien extrahieren, die im Verzeichnis vorhanden sind (eine Dateiname -Transformation in den Dateien durchzuführen, während sie extrahiert werden.

Es gibt kein Problem damit, mit a etwas Ähnliches zu tunu003Ccopy> Das hat einen Dateiensatz mit einemu003Cpresent> Element, aber es scheint nicht für mich mit Unzip zu arbeiten:

<unzip src="${cur.srcdir.live}" dest="${cur.srcdir.archive-files.dir}" overwrite="true">
    <fileset dir=".">
        <present present="both" targetdir="${cur.srcdir}" />
        <type type="file" />
    </fileset>
    <globmapper from="*" to="*.${backup.suffix}" />
</unzip>

Hat jemand so etwas schon einmal getan? Dies ist Ant 1.8.0. Vielen Dank!

War es hilfreich?

Lösung

Ich konnte mein Problem lösen, indem ich das "fälschen"u003Cpresent> Selektor, der in verwendet werden kannu003Ccopy> . Hier ist wie:

Zuerst habe ich PathConvert verwendet, um eine Liste der Dateien in meinem Ordner zu erstellen:

    <pathconvert property="extract.list" pathsep="&#xA;">
        <path>
            <fileset dir="${extract.src.dir}" includes="${extract.src.dir.relpath}">
                <type type="file" />
            </fileset>
        </path>
        <map from="${extract.src.dir}\" to="" />
    </pathconvert>

Beachten Sie, dass der Benutzer einer Karte, damit die Liste relative Pfade anstelle von absoluten Pfaden ist. Außerdem ist der Trennzeichen eine neue Linie.

Dann wird diese Liste in eine Datei geschrieben:

    <echo file="${props.tmp.file}" message="~~~~noop~~~~&#xA;${extract.list}" append="false" />

Ich habe diesen "Nooop" -Intertrag dort eingelegt, damit die Datei immer mindestens eine Zeile hat. Dies ist wichtig, da unser nächster Schritt, in dem wir dies als Include -Datei verwenden. Wenn die IncludeFile leer ist, interpretiert ANT, die als "etwas zulassen" ... aber wir möchten sicherstellen, dass eine leere Liste dazu führt, dass nichts aus dem Reißverschluss extrahiert wird.

Letzter Schritt besteht darin, mit unserer Temp -Datei von oben als Include -Datei aus dem Reißverschluss zu extrahieren. Der GlobMapper benennt die Dateien nach Extraktion in die entsprechenden Sicherungsnamen:

    <unzip src="${extract.archive}" dest="${extract.dest.dir}" overwrite="true">
        <patternset>
            <includesfile name="${props.tmp.file}" />
        </patternset>
        <globmapper from="*" to="*.${backup.suffix}" />
    </unzip>

Andere Tipps

Sie können versuchen, den Befehl unzip über via anzurufen Geschäftsführer Aufgabe.
Das Beispiel, das ich unter Windows überprüft habe, bei denen aktualisiert wurde, haben nur die Dateien geändert dest.folder:

<property name="zip.file_name" value="Archive.zip"/>
<property name="src.folder" value="d:\"/>
<property name="dest.folder" value="d:\55"/>

<target name="unzip">
    <echo>unzip -fo ${src.folder}${zip.file_name}</echo>
    <exec dir="${dest.folder}" executable="cmd.exe" output="${src.folder}operation_result.txt">

        <arg line="/c unzip -fo ${src.folder}${zip.file_name}"/>
    </exec>
</target>

Wenn Sie Ihre Originaldateien bleiben möchten, können Sie diesen Befehl verwenden:

<arg line="/c unzip -foB ${src.folder}${zip.file_name}"/>

Für den Fall -B Parameter Ihre Originaldateien (im Ordner gespeicherten) werden umbenannt - das Tilde -Symbol wird angehängt. Sie erhalten zwei Dateiensätze - aus Archiv- und alten Originaldateien extrahiert.
Danach können Sie Dateien mit Hilfe von umbenennen move Aufgabe.

Fügen Sie dies hier hinzu, falls jemand die Verzeichnisstruktur bei der Extraktion ändern muss. Ich habe so viel versucht, dies zum Laufen zu bringen. Ameisen -Unzip -Aufgabe akzeptieren cutdirsmapper.

<unzip dest="${build.dir}/packages">
    <fileset dir="${src.dir}/packages" includes="*.pkg" />
    <!-- Exctract build folder contents also moving one level up. -->       
    <cutdirsmapper dirs="1" />
    <patternset>
        <include name="build/" />
    </patternset>
</unzip>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top