"ফাইন্ড" ব্যবহার করে দুটি তারিখের মধ্যে ফাইলগুলি কীভাবে সন্ধান করবেন?


21

আমার একটি ইমেল অ্যাকাউন্ট রয়েছে যা GB০ জিবি ইমেল পাস করেছে এবং গত বছরের ইমেল সংরক্ষণাগারটিতে ইমেল ক্লায়েন্ট ব্যবহার করে আমার অনেক সমস্যা হচ্ছে (২০১১)

টার্মিনাল মাধ্যমে, আমি ব্যবহার করার চেষ্টা করছি খোঁজ 2011-01-01 এবং 2011-12-31, কিন্তু কোন উপকার মধ্যে ফাইলগুলি সনাক্ত।

আমি কীভাবে দুটি তারিখের মধ্যে ফাইলগুলি খুঁজে পেতে পারি?

যদি প্রাসঙ্গিক হয় তবে শেষ লক্ষ্যটি এমন একটি ব্যাচ হবে যা পাওয়া প্রতিটি ফাইলই তারিখের ব্যবধানের সাথে মিল রেখে একটি ফোল্ডারে নিয়ে যাবে।


@ এলিয়াকাগান সেই সময়, যদি মেমরিটি কাজ করে তবে সদৃশ নামগুলি কোনও সমস্যা ছিল না। যাইহোক, আপনি যদি সময় দেন যে আপনার কাছে সময় আছে, তবে যে কোনও বিষয়ে অতিরিক্ত তথ্য সর্বদা প্রশংসা করা হয় :) এছাড়াও, আমি আপনার উত্তরটিকে ভোট দিয়েছি কারণ এটি এই বিষয়ে অতিরিক্ত অন্তর্দৃষ্টি সরবরাহ করে।
Zuul

@ এলিয়াকাগান সেক্ষেত্রে, আমি আপনাকে যে কার্যকর ব্যর্থতা-সুরক্ষিতভাবে তুলে
ধরেছি

উত্তর:


16

আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন:

#!/bin/bash
for i in $(find Your_Mail_Dir/ -newermt "2011-01-01" ! -newermt "2011-12-31"); do
  mv $i /moved_emails_dir/
done

6
এর ফলে findশেল forলুপে আউটপুট প্রক্রিয়া করা উচিত নয় , যখন কোনও গ্যারান্টি দেওয়া হয় যে কোনও ফাইলের নামে ফাঁকা স্থান নেই। -exec, -execdirবা -print0 | xargsসাধারণত পরিবর্তে ব্যবহার করা উচিত; আরেকটি সম্ভাব্য সমাধান, যা সাধারণত অনেক কম কাঙ্ক্ষিত তবে forলুপটি ব্যবহারের অনুমতি দেয় তা হল সাময়িকভাবে সেট করা IFSযাতে কোনও স্থান ফিল্ড বিভাজক হিসাবে স্বীকৃত হয় না।
এলিয়াহ কাগন

@ এলিয়াকাগান তাই কমান্ডটি তখন কেমন হবে: কেবল সাথে প্রতিস্থাপন findকরবেন exec? আপনার কি এমন কোনও উত্তর যুক্ত করতে আপত্তি হবে যা স্পেসের ব্যবহারকে সম্বোধন করে .. ?? অনেক প্রশংসিত.
শারিলহোহমান

3
@ শেরিলহোমন নো, execকমান্ডটি ব্যবহার করবেন না । চালানোর findজন্য -execঅ্যাকশন সহ কোনও কমান্ড ব্যবহার করুন mvবা আপনার যা যা চালাতে হবে তা উত্তর পোস্ট করুন যা আমি পোস্ট করেছি । যখন find... -execআপনার কমান্ডটি যে পাথরগুলির সন্ধান করেছে এটি দিয়ে চালায়, এটি শেল ব্যবহার করে না, তাই স্পেসগুলি শব্দ বিভাজন বা গ্লোববিংকে ট্রিগার করে না । (আপনি আপনার নির্দিষ্ট কেস সম্পর্কে একটি নতুন প্রশ্ন পোস্ট করতে চাইতে পারেন, বা আপনি যা জানতে চান ঠিক তা জানতে চাইতে পারেন))
এলিয়াহ কাগন

@EliahKagan দুঃখিত, আমি আপনার পোস্ট ভুল ব্যাখ্যা করা - এবং তা থেকে যে আপনি ! তুমি অসাধারণ! আপনার পোস্টটি দুর্দান্ত .. এবং সাড়া দেওয়ার জন্য ধন্যবাদ, যদিও এটি পড়ার ক্ষেত্রে আমার নিজের ত্রুটি ছিল !!
শেরিলহোমান 21

40

বাশ দুটি তারিখের মধ্যে ফাইলগুলি সন্ধান করে:

find . -type f -newermt 2010-10-07 ! -newermt 2014-10-08

2010-10-07 এর পরে এবং 2014-10-08 এর আগে টাইমস্ট্যাম্প থাকা ফাইলগুলির একটি তালিকা ফেরত দেয়

১৫ মিনিট আগে এখন অবধি বাশ ফাইলগুলি সন্ধান করে:

find . -type f -mmin -15

15 মিনিট আগে কিন্তু এখন আগে টাইমস্ট্যাম্পযুক্ত ফাইলগুলির একটি তালিকা ফেরত দেয়।

বাশ দুটি টাইমস্ট্যাম্পের মধ্যে ফাইলগুলি সন্ধান করে:

find . -type f -newermt "2014-10-08 10:17:00" ! -newermt "2014-10-08 10:53:00"

2014-10-08 10:17:00এবং এর মধ্যে টাইমস্ট্যাম্প সহ ফাইলগুলি ফিরিয়ে দেয়2014-10-08 10:53:00


10

ফাইলগুলি সরানো, এবং সদৃশ নাম থাকলে ব্যবহারকারীকে অনুরোধ করা:

যেমন সাবভি থ্রিশন এবং এরিক লেসচিনস্কির উত্তরগুলি দেখায়, -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/mvmv
  • আপনি যদি সেই ডিগ্রি ইন্টারঅ্যাক্টিভিটিও না চান এবং 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 qp -a qfind-type f

পরীক্ষার মতো, ক্রিয়াগুলি সত্য বা মিথ্যাতেও মূল্যায়ন করে। এইভাবে, -execযদি মৃত্যুদণ্ডপ্রাপ্ত কমান্ডটি রিপোর্টিং সাফল্য (সত্য) বা ব্যর্থতা (মিথ্যা) থেকে বেরিয়ে আসে reports আমাদের এই -execপ্রকাশের শৃঙ্খলটি অন্তর্নিহিত এবং :

-exec mv -n {} destdir/ \; -exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;

এটি ফাইলটি সরাতে চেষ্টা করে এবং যদি mvব্যর্থতার রিপোর্ট হয় তবে থামে। আমরা অন্য কোনও সমস্যা হ'ল কেন তা সরানো হয়নি সে সম্পর্কে সঠিকভাবে এড়িয়ে যাওয়া ফাইল সম্পর্কে সতর্ক করতে চাই না।

কিন্তু যদি সফল, তাহলে রান কমান্ড । পছন্দ করুন , আর্গুমেন্ট হিসাবে পাস করা নিজস্ব ধরণের মতপ্রকাশকে সমর্থন করে। চেক পরে প্রতীক যদি (দ্বারা এটি পাস স্থানে ) বিদ্যমান (এবং নিয়মিত ফাইল), এবং আয় সত্য / সাফল্য বা মিথ্যা / ব্যর্থতা। (অনেক কমান্ডের প্রস্থান স্থিতিগুলি সাফল্য বা ব্যর্থতার পরিচায়ক হিসাবে সর্বোত্তমভাবে ব্যাখ্যা করা হয়, তবে এর উপস্থিতির অবস্থানটি সাধারণত সত্য বা মিথ্যা হিসাবে সর্বোত্তমভাবে ব্যাখ্যা করা হয়))[find[[ -f {} ]-ffind{}
[

যদি [মিথ্যা ফিরিয়ে দেওয়া হয়, তবে ফাইলটি চলে গেছে, সুতরাং এটি সরানো হয়েছিল, তাই কিছু করার দরকার নেই। তবে যদি [মিথ্যা ফিরিয়ে দেওয়া হয়, ফাইলটি এখনও রয়েছে। তারপরে findপরবর্তী -execঅভিব্যক্তিটি মূল্যায়ন করে , যা সতর্কতা বার্তা প্রিন্ট করে।

আরও পড়া


যখন আমি সময় পাই, আমি আশা করি পারফরম্যান্স বিবেচনার বিষয়ে এবং শীঘ্রই কিছু সময়ের -exec ... +সাথে একটি বিভাগ যুক্ত করব mv -t
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.