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