2011-10-18 6 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

당신이 게시하는 것처럼 unzip 작업이 표현을 지원하지 않는 것 같습니다.아카이브를 임시 폴더에 압축을 풀고 대상 폴더에 새로 고침 모드로 파일을 복사해야합니다 (현재 상태의 도움으로) –

+0

생각을 감사하십시오. 최후의 수단으로 나는 아카이브를 완전히 압축 해제 할 것이지만, 때로는이 아카이브가 크기 때문에 (그리고 일반적으로 우아함을 위해서) 나는 그것을 피하기를 바랬다. – FanOfTamago

+0

나는 본다. 질문을 북마크했습니다. 당신은 -f 옵션을 사용하여 명령으로 unzip을 실행해야 할 수도 있습니다 (기존 파일 새로 고침)? 나는 당신이'exec' 작업을 사용할 수 있다는 것을 의미합니다 : http://ant.apache.org/manual/Tasks/exec.html –

답변

2

나는 < > <copy>에 사용할 수있는 셀렉터를 "위장하여"문제를 해결할 수있었습니다.

먼저 내 폴더에있는 파일의 목록을 작성 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"항목을 넣어. 이것은 우리가 includefile로 사용하는 다음 단계 때문에 중요합니다. includesfile이 비어 있다면, Ant는 이것을 "무엇이든 허용"이라고 해석하지만 빈 목록으로 인해 압축이 해제되지 않도록합니다.

마지막 단계는 위의 임시 파일을 포함 파일로 사용하여 압축 파일에서 추출하는 것입니다. 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 명령을 호출해볼 수 있습니다.
dest.folder 파일을 변경 리프레시 내가 Windows에서 확인 샘플 :

<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

문제는 기존 파일들을 신선하게하고 싶지 않다는 것입니다. 백업 목적으로 일치하는 파일의 압축을 풀고 싶습니다. 그래서, zip 파일에 A, B, C가 있다고 가정 해 봅시다. zip 밖에있는 소스 디렉토리에 A와 C가 들어 있다고 가정 해 봅시다. zip 파일에서 A와 C를 A.backup과 C.backup 파일로 추출하려고합니다. . 내 질문에서 볼 때 그 목적을 위해 globmapper를 사용하는 방법을 볼 수 있으며이 기술은 일반적으로 파일 세트와 잘 작동합니다. exec 및 압축 해제 프로세스를 사용하여이 작업을 수행 할 수있는 방법이 있으면 알려주십시오! – 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>