टी एल; डॉ:
सभी फाइलें जो दोनों में मौजूद हैं 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
ऐसा है या नहीं, जो पहले पूछकर ओवरराइटिंग फ़ाइलों को रोक सकता है।