2011-10-18 31 views
4

我有一個zip文件,並單獨包含一些文件的目錄只提取文件。從zip文件中,我只想提取目錄中存在的文件(對文件進行文件名轉換,因爲它們正在被提取......基本上,我正在對這些文件進行備份)。螞蟻解壓任務,並根據其他目錄

有做了<副本>有一個<目前>元素的文件集類似的東西沒有問題,但它似乎並沒有爲我工作與解壓:

<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> 

有沒有人之前做過這樣的事情?這是Ant 1.8.0。謝謝!

+0

這似乎是解壓縮任務不支持表達式就像你發佈。可能是你應該解壓檔案到臨時文件夾,然後以刷新模式(在現狀的幫助下)將文件複製到目標文件夾 –

+0

欣賞這個想法。作爲最後的手段,我會完全解壓檔案,但是因爲有時候這些檔案很大(只是爲了一般的高雅),我希望避免這種情況。 – FanOfTamago

+0

我明白了。我已經爲您的問題添加了書籤。可能你應該使用-f選項運行解壓縮命令(刷新現有文件)?我的意思是你可以使用'exec'任務:http://ant.apache.org/manual/Tasks/exec.html –

回答

2

我能夠通過「僞造」<目前的>選擇器來解決我的問題,該選擇器可用於<副本>。具體方法如下:

首先,我用我的pathconvert文件夾中創建文件的列表:

<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> 

注意到地圖的用戶具有的名單是相對路徑,而不是絕對路徑。另外,分隔符是換行符。

然後這個列表被寫入一個文件:

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

我把「nooop」條目在那裏,這樣文件總是至少有一條線。這一點很重要,因爲我們下一步將把它作爲includesfile使用。如果includesfile爲空,Ant會將其解釋爲「允許任何內容」......但我們希望確保空列表不會從zip中提取任何內容。

最後步驟是使用我們的臨時文件從上面作爲一個包括文件從zip提取。該globmapper在提取後重命名這些文件,以相應的備份名稱:

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

+1不錯的解決方案 –

1

您可以嘗試通過exec任務調用unzip命令。
我在Windows上檢查的樣品是隻刷新在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> 

如果你想保持你的原始文件,你可以使用這個命令:

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

如果使用-B參數您的原始文件(存儲在文件夾中)將被重命名 - 代字符號將被附加。你會得到兩組文件 - 從檔案和舊的原始文件中提取。
之後,你可以用move任務的幫助下重命名文件。

+0

問題是我不想刷新現有的文件。我想提取用於備份目的的匹配文件。所以,假設壓縮文件包含A,B和C.現在我們假設我的源代碼目錄(zip之外)包含A和C.我想從壓縮文件中提取A和C到文件A.backup和C.backup 。你可以從我的問題中看到,我是如何擁有globmapper的,並且這種技術通常適用於文件集。如果你看到一種方法來使用exec和unzip過程來完成這個任務,請告訴我! – FanOfTamago

+0

我剛更新我的回答 –

+0

謝謝;我看到你在說什麼,但採取了另一種方法來避免使用exec。見另一個答案。不過,我感謝你對我的這個頭腦風暴。 – FanOfTamago

0

添加此位置,以防有人需要改變對提取的目錄結構。我花了這麼多努力使這個工作。 Ant解壓縮任務接受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>