使用 zip 命令将文件添加到 zip 存档并跳过现有文件

使用 zip 命令将文件添加到 zip 存档并跳过现有文件

使用 zip 命令将文件添加到现有存档时是否可以跳过现有文件?

zip -u仅添加更改或新文件,但我需要仅添加新文件,跳过“更改”。

背景(尽管它应该是不相关的):我有其他进程生成的 zip 存档,并且我想添加默认文件(如果它们丢失)(不要用默认值覆盖更改的文件)。

答案1

从 zip 存档中提取文件名很棘手,因此请谨慎使用以下内容;它只会处理不包含空格或制表符(不包含 中的字符$IFS)的文件名。

第一种方法使用 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%)

相关内容