টি এল; ডিআর:
উভয় উপস্থিত থাকা সমস্ত ফাইল 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)"
তারপরে, আমরা এসসিআর-তে সমস্ত ফাইল তালিকাভুক্ত করি:
$ 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বা এটির মতো কিনা , এটি প্রথমে জিজ্ঞাসা করে ফাইলগুলিকে ওভাররাইটিং আটকাতে পারে।