zip 명령을 사용하여 zip 아카이브에 파일을 추가하고 기존 파일을 건너뜁니다.

zip 명령을 사용하여 zip 아카이브에 파일을 추가하고 기존 파일을 건너뜁니다.

zip 명령을 사용하여 기존 아카이브에 파일을 추가할 때 기존 파일을 건너뛸 수 있습니까?

zip -u변경 사항이나 새 파일만 추가하되 "변경 사항"을 건너뛰고 새 파일만 추가해야 합니다.

배경(관련이 없어야 함): 다른 프로세스에서 생성된 zip 아카이브가 있고 누락된 경우 기본 파일을 추가하고 싶습니다(변경된 파일을 기본값으로 덮어쓰지 않음).

답변1

$IFSzip 아카이브에서 파일 이름을 추출하는 것은 까다로우므로 다음을 주의해서 사용하십시오. 공백이나 탭이 포함되지 않은 파일 이름 만 처리됩니다 ( 의 문자 제외 ).

첫 번째 방법은 grep 루프를 사용하여 요청된 각 파일이 아카이브에 이미 존재하는지 여부를 묻고, 그렇지 않은 경우 루프는 해당 파일을 아카이브에 추가합니다.

두 번째 방법은 zip명령을 실행하지만 옵션을 사용하여 zip에 이미 아카이브에 있는 파일을 제외하도록 지시합니다 -x.

zipaddgrep() {
  ziparchive=$1
  shift
  for arg
  do
    if ! zipinfo -1 "$ziparchive" | grep -Fqx "$arg"
    then
        zip "$ziparchive" "$arg"
    fi
  done
}

zipaddexclude() {
  ziparchive=$1
  shift
  zip -u "$ziparchive" "$@" -x $(zipinfo -1 "$ziparchive")
}

데모로:

# setup
mkdir ~/tmp/472017
cd ~/tmp/472017
mkdir thefiles
date > thefiles/file1
date > thefiles/file2
date > thefiles/file3
zip zipfile thefiles/file{1,2}

# method 1
$ set -x
$ zipaddgrep zipfile.zip thefiles/*
+ zipaddgrep zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3
+ ziparchive=zipfile.zip
+ shift
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file1
+ zipinfo -1 zipfile.zip
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file2
+ zipinfo -1 zipfile.zip
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file3
+ zipinfo -1 zipfile.zip
+ zip zipfile.zip thefiles/file3
  adding: thefiles/file3 (stored 0%)

# cleanup
rm zipfile.zip
zip zipfile thefiles/file{1,2}

# method 2
$ zipaddexclude zipfile.zip thefiles/*
+ zipaddexclude zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3
+ ziparchive=zipfile.zip
+ shift
++ zipinfo -1 zipfile.zip
+ zip -u zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3 -x thefiles/file1 thefiles/file2
  adding: thefiles/file3 (stored 0%)

관련 정보