zip 명령을 사용하여 기존 아카이브에 파일을 추가할 때 기존 파일을 건너뛸 수 있습니까?
zip -u
변경 사항이나 새 파일만 추가하되 "변경 사항"을 건너뛰고 새 파일만 추가해야 합니다.
배경(관련이 없어야 함): 다른 프로세스에서 생성된 zip 아카이브가 있고 누락된 경우 기본 파일을 추가하고 싶습니다(변경된 파일을 기본값으로 덮어쓰지 않음).
답변1
$IFS
zip 아카이브에서 파일 이름을 추출하는 것은 까다로우므로 다음을 주의해서 사용하십시오. 공백이나 탭이 포함되지 않은 파일 이름 만 처리됩니다 ( 의 문자 제외 ).
첫 번째 방법은 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%)