टी एल; डॉ:
सभी फाइलें जो दोनों में मौजूद हैं srcऔर destउन्हें destइस तरह से हटाया जा सकता है :
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
चरण-दर-चरण, स्पष्टीकरण के लिए, नीचे देखें।
समस्या को सरल बनाना:
यह समझने के लिए कि हम वास्तव में क्या करना चाहते हैं, हम इसे लागू करके शुरू करते हैं:
जिस कमांड को हम पूर्ववत करना चाहते हैं वह है
sudo cp From_SOURCE/* To_DESTINATION/
पूर्ववत् कैसे करें, sudoयह समझने के लिए प्रासंगिक नहीं है।
मैं निर्देशिका नाम का उपयोग करेंगे srcके लिए From_SOURCEऔर destके लिए To_DESTINATION।
अब, हमारा आदेश है:
cp src/* dest/
यदि srcफ़ाइलें हैं f1, f2और f3, और निर्देशिका d1और d2, खोल करने के लिए है कि आदेश का विस्तार:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
जैसे विकल्पों के बिना -r, -Rया -a, कमांड cpनिर्देशिकाओं की नकल नहीं करता है।
इसका मतलब है, उनमें से प्रत्येक के लिए एक त्रुटि दिखाते हुए, कमांड उन्हें छोड़ देगी:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
इसका मतलब है, हमने केवल साधारण फ़ाइलों की प्रतिलिपि बनाई है, और कोई निर्देशिका नहीं, के लिए dest।
तय करना है कि किन फाइलों को निकालना है:
संभवतः फाइलों में destभी इसी नाम की फाइलें थीं src। इस मामले में, फाइलें अधिलेखित कर दी गईं (1)। उनके लिए बहुत देर हो चुकी है, क्षमा करें। उन्हें नवीनतम बैकअप से वापस लाएं।
जो फाइलें हैं, उनके बारे में हम केवल उन्हीं फाइलों को हटाना चाहते हैं जिनकी नकल की गई है। ये फ़ाइलें दोनों निर्देशिकाओं में समान नाम और समान सामग्री के साथ मौजूद हैं।
इसलिए हम इन फाइलों की तलाश करते हैं:
सबसे पहले, हम cdमें src, क्योंकि यह निम्न findआदेशों को बहुत सरल बनाता है, और भाग्य के पूर्ण पथ के लिए एक चर सेट करता है:
$ cd src
$ destdir="$(readlink -f dest)"
फिर, हम src में सभी फाइलों को सूचीबद्ध करते हैं:
$ find . -maxdepth 1 -type f
और, मिली प्रत्येक फ़ाइल के लिए, cmpयह जांचने के लिए उपयोग करें कि क्या भाग्य में समान सामग्री वाली कोई फ़ाइल है:
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
फ़ाइलों को हटा रहा है, ध्यान से:
ये फाइलें वे हैं जिन्हें हम हटाना चाहते हैं। लेकिन यह सुनिश्चित करने के लिए, हम उन्हें पहले एक अलग निर्देशिका में ले जाते हैं - और उन्हें चलाने से पहले कमांड पर एक नज़र डालते हैं:
$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`
अछा लगता है! अब हम echoअसली mvकमांड्स को चलाने के लिए छोड़ सकते हैं :
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
से सभी फाइलें destकि से नकल कर रहे थे srcवास्तव में में एक ही है, और अभी भी srcऔर dest, में अब कर रहे हैं /tmp/toDelete/, और एक आखिरी बार देख लेने के बाद हटाया जा सकता है।
नोट:
(1) जाँच करें कि क्या cpकोई अन्य व्यक्ति cp -iऐसा है या नहीं, जो पहले पूछकर ओवरराइटिंग फ़ाइलों को रोक सकता है।