2016-08-18 3 views
4

zip과 관련하여 보관 파일 생성 제외 목록에 전달 된 파일과 관계없이 파일이 보관 파일에 추가되도록하는 방법을 찾고 있습니다.제외 패턴의 일부인 경우에도 파일을 추가하는 방법

예를 들어, 사용자가 zip을 만들 때 자신의 제외 필터를 지정할 수있는 응용 프로그램을 개발했습니다.

그러나 필자는 필터에 지정된 것과 관계없이 항상 몇 개의 사용자 지정 파일이 아카이브에 추가되도록해야합니다. 예를 들어

:

  • 필터 정의 : "* .bar 인"
  • 파일 나는 추가해야합니다

foo.bar에 내가 실행 그렇다면

zip -rq -i foo.bar -x "*.bar" 

foo.bar는 아카이브에 포함되지 않습니다.

는 그래서 아래에 온다 :

  • 어떻게 내가 추가해야 할 몇 가지 파일 제외 목록에 무엇을 재정의 할 수 있습니다?
  • 또는 사용자가 foo.bar를 제외하고 모두 생략한다는 것을 효과적으로 지정하는 것을 조합 한 제외 표현식을 개발할 수 있습니까?

해결책은 두 가지 방법이 있습니다. 먼저 제외 목록이있는 아카이브를 만든 다음 foo.bar를 사용하여 아카이브를 늘리십시오.하지만 할 일이 필요합니다. 한 번에.

감사합니다.

+0

이를 달성하는 가장 쉬운 방법은, 사용자 정의 제외리스트 먼저 ZIP 압축을 실행 한 다음에 추가로 다시 ZIP 압축을 실행할 이미 아카이브 파일에 이미 존재하는 파일을 건너 뛰는 데 필요한 옵션을 사용하여 아카이브에 항상 추가해야하는 파일을 ZIP 파일로 생성했습니다. 가장 좋은 경우에는 두 번째 실행시 ZIP 파일에 파일이 추가되지 않습니다. 최악의 경우 두 번째 실행시 파일이 항상 추가됩니다. – Mofi

+0

감사합니다. 현재 실제로이 작업을 수행하고 있지만 단점이 있습니다. 완전히 새로운 아카이브가 생성되지만 기존 아카이브는 최소한 일시적으로 유지됩니다. 이로 인해 디스크 공간에 문제가 발생할 수 있습니다. 즉, 이중 생성을 둘러싼 한 가지 방법은 압축 ('-0'스위치) 대신 압축을 '저장'으로 설정하는 것입니다. 완전히 새로운 아카이브를 작성해야하는 번거 로움없이 파일을 추가 할 수 있습니다. –

답변

1

-i 옵션은 지정된 파일 만 포함하는 데 사용됩니다. 패턴 "foo.bar"를 사용하면 foo.bar라는 파일 만 남기고 나머지는 남겨 둡니다.

-x 옵션은 파일을 제외하는 데 사용됩니다. 패턴 "* .bar"를 사용하면 이전에 포함 된 foo.bar 파일을 제외합니다.

또한 패턴이 pathname expansion으로 해결되어야하며 POSIX 또는 Perl 정규 표현식이 아닌 것으로 간주해야합니다. 패턴을 더 복잡하게하려면 extended patterns을 사용할 수 있습니다. 예를함으로써

:

shopt -s extglob 
zip -rq foo.zip . -i ?(foo.bar|!(*.bar)) 
shopt -u extglob 

또는 :

shopt -s extglob 
zip -rq foo.zip . -x !(!(*.bar)|foo.bar) 
shopt -u extglob 

하지만 패턴이 하위 디렉토리를 숙고하지 않기 때문에 마지막 명령은 재귀하지 않습니다. -r 옵션을 사용하더라도 패턴의 파일 만 포함합니다. 매뉴얼 페이지는 재 적용 적으로 적용하기 전에 '*'앞에 쓰기 '\'에 대해 알려주지 만 모든 패턴에 대해서는 작동하지 않습니다.

또한 다른 명령을 사용하여 포함 할 파일 목록을 가져올 수 있습니다.모범

:

zip -rq foo.zip . -i `find ./ -not -name "*.bar" -o -name "foo.bar"` 

또는 :

zip -r foo.zip . -x `find ./ -name "*.bar" -a -not -name "foo.bar"` 
관련 문제