ফাইলগুলি সরানো, এবং সদৃশ নাম থাকলে ব্যবহারকারীকে অনুরোধ করা:
যেমন সাবভি থ্রিশন এবং এরিক লেসচিনস্কির উত্তরগুলি দেখায়, -newermt
ভবিষ্যদ্বাণীকরা তার অপারেন্ড হিসাবে নির্দিষ্ট করা তারিখের (এবং optionচ্ছিক সময়) তুলনায় সাম্প্রতিক সময়ে পরিবর্তিত ফাইলগুলি নির্বাচন করে। ফাইলগুলি সন্ধান করতে
- যে কোনও জায়গায়
srcdir
(যেমন, এর উপ-ডিরেক্টরিগুলি, তাদের উপ-ডিরেক্টরিগুলি ইত্যাদি)
- সর্বশেষ পরিবর্তন হয়েছে (উদাহরণস্বরূপ) সেপ্টেম্বর 2014 এ
- এবং তাদের সরাতে করতে
destdir
... আপনি চালাতে পারেন:
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -i {} destdir/ \;
একটি ইন -exec
অভিব্যক্তি, খুঁজুন ফাইলের নাম এর জায়গায় পাওয়া পাসের {}
। ;
থেকে প্রকাশ করে -exec
যে কমান্ড চালানো যাবে, এবং তার আর্গুমেন্ট, সমস্ত প্রদান করা হয়েছে (যদি পরবর্তী অভিব্যক্তি বিশেষ পর এটি গৃহীত হয় -exec
- এই একটি উদাহরণ জন্য নীচে দেখুন সম্পৃক্ত এর আর্গুমেন্ট)। শেল দ্বারা এটি বিশেষভাবে ব্যাখ্যা না ;
করা উচিত \;
তাই পালাতে হবে । (ছাড়া \
, ;
পুরো find
কমান্ডটি শেষ করে নতুন লাইনের মতো একই কাজ করবে। যদিও এই find
কমান্ডের এই -exec
প্রকাশের পরে কিছুই নেই , ;
তবুও আর্গুমেন্টটি পাস করতে ব্যর্থ হওয়া একটি সিনট্যাক্স ত্রুটি))
আপনি যদি কেবল ফাইলগুলি তালিকাভুক্ত করতে চান - তবে পুরানো ইমেলগুলি কীভাবে সংরক্ষণ করা হয় বা অন্যান্য ফাইলগুলি কী উপস্থিত থাকতে পারে তা নিশ্চিত না হলে - যা পরামর্শ দেওয়া হয় - বাদ -exec
এবং তার ডানদিকে সমস্ত কিছু। (ইমেলের জন্য, প্রায়শই বিভিন্ন তারিখের ইমেলগুলি একই ফাইলে সংরক্ষণ করা হয় ; এখানে প্রশ্নে বর্ণিত পরিস্থিতিতে কারও জন্য আমি কোনও ফাইল সরিয়ে নেওয়ার আগে সেগুলি কীভাবে সংরক্ষণ করা হয় তা খতিয়ে দেখার পরামর্শ দিই)) আপনি উভয়ই তাদের নাম মুদ্রণ করতে চান এবং সরিয়ে নিতে চান তাদের, -print
আগে যোগ করুন -exec
।
mv -i
গন্তব্যে যে কোনও সময় কোনও ফাইলকে ওভাররাইট করা হবে এমন অনুরোধ জানানো হয় যেমন ঘটবে যদি:
- পূর্ববর্তী ব্যাকআপ থেকে একই নামের একটি ফাইল উপস্থিত রয়েছে, বা
- একই নামের একটি ফাইল তবে এর ভিন্ন সাব-ডিরেক্টরি থেকে
srcdir
ইতিমধ্যে একই find
অপারেশনের সময় সরানো হয়েছে , বা
- (কমপক্ষে সম্ভবত) একই নামের একটি ফাইল
srcdir
একই find
অপারেশন চলাকালীন কোথাও তৈরি হয়েছিল , আসলটি সরানোর পরে তবে খুব শীঘ্রই একবারে find
আলাদা সাবডাইরেক্টরিটি অনুসরণ করলেই এটি যথেষ্ট পাওয়া যায় ।
আহবান করার অন্যান্য উপায় rm
:
ডুপ্লিকেট নামের সাথে ফাইলগুলি কীভাবে পরিচালনা করতে হয় তার জন্য আপনার কাছে অন্যান্য বিকল্প রয়েছে।
-i
(অর্থাত্ ) ছাড়াই সাধারণত অনুমোদনের জন্য অনুরোধ জানানো হয় না, তবে গন্তব্য ফাইলটি কেবল পঠনযোগ্য হলে তা করত। ( এমনকি কখনও কখনও কেবল পঠনযোগ্য ফাইলটি ওভাররাইট করার ক্ষেত্রেও সফল হতে পারে, যেমন এটি চালিত ব্যবহারকারী যদি ফাইলটির মালিক হন))mv {} destdir/
mv
mv
- আপনি যদি সেই ডিগ্রি ইন্টারঅ্যাক্টিভিটিও না চান এবং
mv
সর্বদা চান (নামানোর চেষ্টা) নামযুক্ত ফাইলগুলি ওভাররাইট করতে চান তবে ব্যবহার করুন mv -f
।
- তাহলে, বিপরীতে, আপনি সোর্স ফাইল এড়িয়ে যেতে যখন ইতিমধ্যে একই নামের, ব্যবহারের একটি গন্তব্য ফাইল চান
mv -n
।
mv
গ্রহণ -b
এবং --backup
পতাকা স্বয়ংক্রিয়ভাবে অভিন্নরুপে নামে ফাইলগুলির ইতিমধ্যে গন্তব্যে অস্তিত্ব নামান্তর করতে। ডিফল্টরূপে ~
ব্যাকআপ নাম উত্পাদন করতে যুক্ত করা হয়, এবং যদি নামের সাথে একটি ফাইল এবং ব্যাকআপ নামের একটি ফাইল ইতিমধ্যে গন্তব্যে উপস্থিত থাকে তবে ব্যাকআপ ফাইলটি ওভাররাইট করা হয়। এই ডিফল্টটি চালনার সময় পাস করা বিকল্পগুলি mv
এবং পরিবেশের ভেরিয়েবল দ্বারা ওভাররাইড করা যায় । দেখুন man mv
বিস্তারিত জানার জন্য, এবং নীচে উদাহরণ।
ডুপ্লিকেট নামের ক্ষেত্রে ফাইলগুলি সরানো এবং ব্যাকআপ তৈরি করা:
সমস্ত ফাইল সরানোর জন্য, ~
প্রত্যয় ব্যবহার করে সদৃশ নামের সাথে ফাইলগুলি ব্যাক আপ করুন এবং ফাইলগুলি ইতিমধ্যে উপস্থিত থাকলে সংখ্যায়িত প্রত্যয় ব্যবহার করুন (যাতে কোনও কিছু ওভাররাইট করা এড়াতে পারে), চালনা করুন:.~n~
.~
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv --backup=existing {} destdir/ \;
আপনি যদি সদৃশ নামের সাথে ফাইলগুলি এড়িয়ে যান এবং কোনটি জানতে চান:
যদি আপনি ব্যবহার করেন mv -n
এবং জানতে চান যে কোন ফাইলটি সরানো হয়নি কারণ একই নামের সাথে অন্য একটি ফাইল রয়েছে, তবে সর্বোত্তম উপায়টি হ'ল মূল find
কমান্ডটি আবার চালানো -exec
, এটির ডানদিকে সবকিছু না করেই। এটি তাদের নাম মুদ্রণ করবে।
আপনি আসল find .... -exec ...
কমান্ডটি চালিয়ে যাওয়ার পরে এটি তৈরি করা কোনও মিলে যাওয়া ফাইলের নামও মুদ্রণ করবে , তবে আপনি পুরানো পরিবর্তনের সময়ের সাথে ফাইলগুলি সন্ধান করার কারণে এই অ্যাপ্লিকেশনটির জন্য সাধারণত কিছু থাকবে না। কোনও ফাইলকে তার আসল বয়সের তুলনায় আরও পুরানো, touch
এবং অন্যান্য ব্যবস্থাসমূহের চেয়ে একটি সংশোধন টাইমস্ট্যাম্প দেওয়া সম্ভব তবে এটি আপনার অজানা ছাড়া এই ক্ষেত্রে ঘটবে বলে মনে হয় না।
ডুপ্লিকেট নামের কারণে ফাইলগুলি এড়িয়ে যাওয়া অবিলম্বে জানা:
mv -n
কোনও ফাইল সরিয়ে নেওয়া থেকে বিরত থাকলে রিপোর্ট করে না বা কোনও বিশেষ প্রস্থান কোড ফেরত দেয় না । সুতরাং find
, রান করার সময় যদি আপনি অবিলম্বে বাদ দেওয়া ফাইলগুলির বিষয়ে অবহিত হতে চান তবে আপনাকে তার জন্য একটি পৃথক পদক্ষেপ নিতে হবে। একটি উপায়:
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -n {} destdir/ \; \
-exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;
কয়েকটি সম্ভবত সামান্য প্রযুক্তিগত বিবেচনা: mv
গন্তব্যস্থলে উপস্থিত থাকার চেয়ে কোনও ভিন্ন কারণে কোনও ফাইল অনুলিপি করতে ব্যর্থ হলে এবং রিপোর্টিং সাফল্যের বাইরে চলে গেলে এটি ভুলভাবে সতর্ক করে । এটি অসম্ভব বলে মনে হচ্ছে তবে এটি অসম্ভব বলে আমি নিশ্চিত নই। এটি সম্ভাব্যভাবে একটি রেসের শর্তেও ভুগছে : পুরানো ফাইলটি সরানোর পরে খুব অল্প সময়ের মধ্যে একই নামের নতুন ফাইল যদি একই জায়গায় তৈরি করা হয়েছিল এবং চেক করার আগে এটির কোনও সতর্কতা না থাকায় সতর্ক করা হত এটি সরানো হয়েছে কিনা দেখুন। (অ্যাপ্লিকেশন বিবেচনা করে আমার সন্দেহ হয় সমস্যা কি কখনো আসলে ঘটবে।) এটা গন্তব্য চেক করতে পুনর্লিখিত করা যেতে পারে আগেপরে পরিবর্তে ফাইলটি সরানো: তারপরে দৌড় শর্তটি উত্স ফাইলগুলির পরিবর্তে নতুন তৈরি গন্তব্য ফাইলগুলির সাথে সম্পর্কিত। এবং যখন ত্রুটি এবং সতর্কবার্তা দ্বারা রিপোর্ট find
বা mv
(অথবা [
, যদিও সেখানে কোনো করা উচিত হবে না) লেখা হবে মান ত্রুটি , আমাদের ...skipped (exists in...
সতর্কবার্তা লেখা পরার মান আউটপুট । সাধারণত উভয়ই আপনার টার্মিনালে উপস্থিত হয় তবে আপনি স্ক্রিপ্ট করছেন কিনা তা বিবেচ্য।
আমি সহজেই পড়ার জন্য এই আদেশটি দুটি লাইনে বিভক্ত করেছি। এটি সেভাবে চালানো যেতে পারে, বা আপনি \
এবং নতুনলাইনটি (যেমন, লাইন ব্রেক) সরাতে পারেন ।
এই find
আদেশটি কীভাবে কাজ করে?
find
পূর্বাভাসগুলি পরীক্ষা (যেমন -type
এবং -newermt
), তাদের রিটার্ন মানগুলির জন্য ব্যবহার করা যেতে পারে বা ক্রিয়া (যেমন -print
এবং -exec
) হতে পারে যা প্রায়শই তাদের পার্শ্ব প্রতিক্রিয়াগুলির জন্য ব্যবহৃত হয়।
কোন অপারেটর (যেমন যখন -a
জন্য এবং , -o
জন্য বা ) এক্সপ্রেশন মধ্যে সরবরাহ করা হয়, -a
উহ্য হয়। find
নিয়োগ শর্ট সার্কিট মূল্যায়ন জন্য এবং এবং বা । (যেমন, ) কেবলমাত্র সত্য যদি পি এবং কিউ এক্সপ্রেশন উভয়ই সত্য হয়, তাই পি মিথ্যা হলে Q এর মূল্যায়ন করা দরকার না । যদিও আমরা প্রায়শই এই পদগুলিতে এটি ভাবি না, এই কারণেই পরবর্তী ক্রিয়া বা পরীক্ষাগুলি মূল্যায়নের জন্য পরীক্ষাগুলি সত্য হতে হয়। উদাহরণস্বরূপ, ধরুন একটি ডিরেক্টরিতে আসে। এটি মিথ্যাতে মূল্যায়ন করে, তাই এটি পরে সমস্ত কিছু এড়িয়ে যেতে পারে।p q
p -a q
find
-type f
পরীক্ষার মতো, ক্রিয়াগুলি সত্য বা মিথ্যাতেও মূল্যায়ন করে। এইভাবে, -exec
যদি মৃত্যুদণ্ডপ্রাপ্ত কমান্ডটি রিপোর্টিং সাফল্য (সত্য) বা ব্যর্থতা (মিথ্যা) থেকে বেরিয়ে আসে reports আমাদের এই -exec
প্রকাশের শৃঙ্খলটি অন্তর্নিহিত এবং :
-exec mv -n {} destdir/ \; -exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;
এটি ফাইলটি সরাতে চেষ্টা করে এবং যদি mv
ব্যর্থতার রিপোর্ট হয় তবে থামে। আমরা অন্য কোনও সমস্যা হ'ল কেন তা সরানো হয়নি সে সম্পর্কে সঠিকভাবে এড়িয়ে যাওয়া ফাইল সম্পর্কে সতর্ক করতে চাই না।
কিন্তু যদি সফল, তাহলে রান কমান্ড । পছন্দ করুন , আর্গুমেন্ট হিসাবে পাস করা নিজস্ব ধরণের মতপ্রকাশকে সমর্থন করে। চেক পরে প্রতীক যদি (দ্বারা এটি পাস স্থানে ) বিদ্যমান (এবং নিয়মিত ফাইল), এবং আয় সত্য / সাফল্য বা মিথ্যা / ব্যর্থতা। (অনেক কমান্ডের প্রস্থান স্থিতিগুলি সাফল্য বা ব্যর্থতার পরিচায়ক হিসাবে সর্বোত্তমভাবে ব্যাখ্যা করা হয়, তবে এর উপস্থিতির অবস্থানটি সাধারণত সত্য বা মিথ্যা হিসাবে সর্বোত্তমভাবে ব্যাখ্যা করা হয়))[
find
[
[ -f {} ]
-f
find
{}
[
যদি [
মিথ্যা ফিরিয়ে দেওয়া হয়, তবে ফাইলটি চলে গেছে, সুতরাং এটি সরানো হয়েছিল, তাই কিছু করার দরকার নেই। তবে যদি [
মিথ্যা ফিরিয়ে দেওয়া হয়, ফাইলটি এখনও রয়েছে। তারপরে find
পরবর্তী -exec
অভিব্যক্তিটি মূল্যায়ন করে , যা সতর্কতা বার্তা প্রিন্ট করে।
আরও পড়া