मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका यह है कि पूरी फाइल को डिलीट कर दिया जाए और फिर से डायर को जिप किया जाए।
'-D' पैरामीटर, जिप से दी गई फाइलों को हटाने के लिए सापेक्ष फाइल पथ की अपेक्षा करता है। '-U' विकल्प ज़िप में नई फाइलें जोड़ता है (या अपडेट करता है)। उनका एक साथ उपयोग नहीं किया जा सकता है।
मुझे यकीन नहीं है कि आप zip कमांड का उपयोग करके आसानी से अपडेट / डिलीट कर सकते हैं। हालाँकि मैंने आपको एक सरल स्क्रिप्ट लिखी है जो आप चाहते हैं कि कर सकते हैं। स्क्रिप्ट को संपादित करने के लिए स्वतंत्र महसूस करें - अब इसके लिए आर्काइव और निर्देशिका की आवश्यकता होती है, जिसे आप एक ही स्थान पर ज़िप / अपडेट करना चाहते हैं (उदाहरण के लिए /home/you/archive.zip और / home / you / directory_to_zip। इसके अलावा) ज़िप में खाली निर्देशिका नहीं जोड़ता है।
#!/bin/bash
archive="archive_name.zip"
directory="dir_to_zip"
#Get list of files in archive
filesinarchive=`unzip -l $archive | sed 's/[ ][ ]*/ /g' | grep 2014 | cut -d" " -f 5 | sort`
#Uncomment when debugging
#echo -e "Files in archive:\n$filesinarchive"
#Get list of files in directory..
filesindirectory=`find $directory/ -type f | sort`
#Uncomment when debugging
#echo -e "\n\nFiles in Directory:\n$filesindirectory"
#Save the lists to tmp files..
echo "$filesinarchive" > /tmp/fia
echo "$filesindirectory" > /tmp/fid
#Compare file lists and return the files present in archive and NOT present in directory
remove=$(comm -1 -3 /tmp/fid /tmp/fia)
#Uncomment when debugging
#echo -e "\n\n\n Files to be deleted:\n$remove \n\n"
#Now delete these files from zip
for file in $remove
do
zip -d $archive $file
done
#We have deleted files which were not present in the directory, now we need to update our zip:
zip -R -u $archive $filesindirectory
#delete temp files
rm -f /tmp/fia /tmp/fid
ऊपर दी गई सामग्री को zipsync.sh नामक फ़ाइल में सहेजें, इसे निष्पादित अनुमतियाँ (chmod + x zipsync) दें और संग्रह और निर्देशिका को ज़िप के साथ निर्देशिका में होने पर चलाएँ।
आप स्क्रिप्ट को संशोधित कर सकते हैं ताकि यह गैर-सापेक्ष पथ और / या खाली निर्देशिका ले सके।
आशा है इससे थोडी मदद मिलेगी।