zipコマンドを使用してzipアーカイブにファイルを追加し、既存のファイルをスキップします。

zipコマンドを使用してzipアーカイブにファイルを追加し、既存のファイルをスキップします。

zipコマンドを使用して既存のアーカイブにファイルを追加するときに既存のファイルをスキップできますか?

zip -u変更または新しいファイルのみを追加しますが、「変更」をスキップして新しいファイルのみを追加する必要があります。

背景(関連してはいけません):他のプロセスで作成されたzipアーカイブがあり、欠落している場合はデフォルトファイルを追加したい(変更されたファイルをデフォルト値で上書きしないでください)。

答え1

$IFSzipアーカイブからファイル名を抽出するのは難しいので、次の点に注意して使用してください。スペースやタブを含まないファイル名のみが処理されます(の文字を除く)。

最初の方法はgrepループを使用して、要求された各ファイルがアーカイブにすでに存在するかどうかを尋ね、そうでない場合、ループはそのファイルをアーカイブに追加します。

2番目の方法は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%)

関連情報