2011-09-21 11 views
6

टेक्स्ट फ़ाइलों के लिए फ़ाइल स्तर पैच बनाने के लिए बहुत सारे समाधान हैं। जो मैं खोज रहा हूं वह एक आसान स्क्रिप्ट/शेल कमांड है जो पुरानेवर्स/न्यूवर्जन की तुलना करेगा/और मुझे उन फाइलों का एक पेड़ देगा जिन्हें मुझे पुराने संस्करण पर कॉपी करने की आवश्यकता है ताकि इसे नए संस्करण के बराबर बनाया जा सके (माना जाता है कि फ़ाइलों को अद्यतन में हटाया नहीं गया है संस्करण)। ध्यान दें कि दो फ़ोल्डरों में बाइनरी और टेक्स्ट दोनों फ़ाइलें शामिल हैं।फ़ाइल/फ़ोल्डर स्तर पैच (सहित बाइनरी फाइलें) बनाने के लिए दो निर्देशिका पेड़ों का डिफ

पहले, हम हैक उपयोग कर रहे थे:

fdupes -qrf newversion/ oldversion/ | grep "newversion" | xargs rm;

फ़ोल्डर "NewVersion" है कि एक पैच के रूप में पैक किया जा सकता है के साथ हमें छोड़कर।

दुर्भाग्यवश, यह विनाशकारी साबित हुआ क्योंकि fdupes फ़ाइल नामों पर विचार नहीं करता है।

क्या अच्छा होगा fdupes की तरह कुछ वास्तव में तुलना में फ़ाइल नाम शामिल किया गया था।

+0

क्या आप केवल "नई" फाइलों की सूची ढूंढ रहे हैं और नए संस्करण में "संशोधित" फाइल नहीं हैं? –

+0

दोनों नई फाइलें और संशोधित फाइलें। –

उत्तर

5

diff आदेश उत्पादन फ़ाइल नाम जो अलग करने के लिए कहा जा सकता है।

diff --quiet --recurse --unidirectional-new-file OLDDIR NEWDIR 

Files old/main and new/main differ 
Files old/main.cpp and new/main.cpp differ 
Files old/Makefile and new/Makefile differ 
Files old/sounds/popalien.wav and new/sounds/popalien.wav differ 
Files old/sounds/saucer.wav and new/sounds/saucer.wav differ 
बेशक

, यह एक अच्छा उत्पादन नहीं है, लेकिन जब से तुम केवल एक पैच के रूप में पैकेज नई फ़ाइलों के लिए देख रहे हैं, एक त्वरित एसईडी पाइप चमत्कार काम करता है:

diff --quiet --recurse -unidirectional-new-file OLDDIR NEWDIR | \ 
    sed "s/^.* and \(.*\) differ/\1/" 

(पठनीयता के लिए टूट)

new/main 
new/main.cpp 
new/Makefile 
new/sounds/popalien.wav 
new/sounds/saucer.wav 

चारों ओर 'और' और पूर्ववर्ती रिक्त स्थान 'अलग'

ऑपरेंड के आदेश भिन्नता के लिए एक अंतर बनाता है, पहला तर्क 'और' का छोड़ दिया जाता है, दूसरा बाद में होता है। इसके लिए बाहर देखो।

इसके अलावा, अगर आप NEWDIR से एक फ़ाइल हटाते हैं, तो यह इसे केवल जोड़ा या परिवर्तित फ़ाइलों के रूप में नहीं मिलेगा। किसी भी उपदिर में नहीं मिली फ़ाइलों के लिए फ़ाइल नामों को आउटपुट करने के लिए, - new फ़ाइल के साथ --unidirection-new-file को प्रतिस्थापित करें। (छोड़कर सभी के लिए लघु विकल्प मौजूद हैं --unidirectional ..)

0

मुझे पता है कि यह काफी समय हो गया है। मुझे एक ही समाधान की आवश्यकता थी। मुझे यह पोस्ट मिला लेकिन यह पर्याप्त नहीं था। तब मुझे rsync नौकरी आईएफएफ मिल सकता है जो आप 'पैच' समान प्रतियां करते हैं, और अन्य परिवर्तनों के साथ विलय की आवश्यकता नहीं है। मैं डिस्कनेक्ट मशीनों पर यम मिरर अपडेट करने के साथ इसका उपयोग करने का इरादा रखता हूं। मेरा पूरा समाधान एक छोटे से अधिक शामिल है, और मैं तो कुछ ठीक विवरण गलत हो सकता है स्मृति से आदेश लिख रहा हूँ, लेकिन मूल में:

# create identical copy "copy.0" 
rsync -a master/ copy.0/ 

# Presumably transfer copy.0/ to another machine for offline use 
# but copy.0 must not mutate outside of this process or sync probably 
# will not work. 

# some time later update master, e.g. rsync master from upstream mirror 
# mutates master in some way, changes/adds/removes remove files including 
# binaries 
echo -n $'\001\002' > master/new.bin 
rm master/gone.bin 

# generate rsync batch that can be used to ``patch`` copy.0 
# to become identical to master 
rsync -a --delete --itemize-changes --only-write-batch=copy.0.batch \ 
    master/ copy.0/ 
# now the file copy.0.batch contains only the deltas to be applied 

# transfer the batch file to where it needs to be applied 

# apply the batch to copy.0 
rsync -a --delete --itemize-changes --read-batch=copy.0.batch copy.0/ 

इस विलोपन और कई अन्य चीजों का ख्याल, शायद अनुमतियाँ लेता है , टाइमस्टैम्प इत्यादि, लेकिन मुझे लगता है कि यह हार्ड लिंक को हार्ड लिंक के रूप में संभाल नहीं सकता है और शायद उन्हें अलग अनलिंक फ़ाइलों के रूप में बनाएगा।