22.12.2011 এবং 24.12.2011 এর মধ্যে পরিবর্তিত সমস্ত ফাইলকে আমি কীভাবে পুনরাবৃত্তভাবে তালিকাবদ্ধ করতে পারি?
22.12.2011 এবং 24.12.2011 এর মধ্যে পরিবর্তিত সমস্ত ফাইলকে আমি কীভাবে পুনরাবৃত্তভাবে তালিকাবদ্ধ করতে পারি?
উত্তর:
সাধারণভাবে বলতে গেলে, আপনি যখন কোনও ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে ফাইলগুলি সন্ধান করেন, তখন ব্যবহার করুন find
।
তারিখের সীমা নির্দিষ্টকরণের সবচেয়ে সহজ উপায় find
হ'ল পরিসীমাটির সীমানায় ফাইলগুলি তৈরি করা এবং -newer
প্রাকটিকেট ব্যবহার করা ।
touch -t 201112220000 start
touch -t 201112240000 stop
find . -newer start \! -newer stop
-newer
এখানে প্রথম আউটপুট অবহেলা করা প্রয়োজন?
-newer
নয়, দ্বিতীয়টি। "ফাইলগুলির চেয়ে নতুন start
তবে এর চেয়ে নতুন নয় এমন ফাইলগুলি সন্ধান করুন stop
"।
start
এবং stop
।
গিলস এর সমাধান ব্যবহার করে এবং লোকটি পড়ার পরে (1) আবার আমি আরও একটি সহজ সমাধান পেয়েছি। সেরা বিকল্প হ'ল -NOWXXY। এম এবং টি পতাকা ব্যবহার করা যেতে পারে।
m The modification time of the file reference
t reference is interpreted directly as a time
সুতরাং সমাধান হয়
find . -type f -newermt 20111222 \! -newermt 20111225
অন্তর্ভুক্তিতে নীচে আবদ্ধ, এবং উপরের সীমাটি একচেটিয়া, তাই আমি এটিতে 1 দিন যুক্ত করেছি! এবং এটি পুনরাবৃত্ত হয়। এটি v4.5.9 অনুসন্ধানে ভাল কাজ করে।
find -newermt 20150212 \! -newermt 20150213 | xargs grep 'keyword' -m 50 -l
( -m 50
= প্রথম 50 টি লাইনে অনুসন্ধান করুন)।
-exec ... +
মধ্যে find(1)
মত: find -newermt 20150212 \! -newermt 20150213 -exec grep keyword -m 50 -l {} +
। এটি একই কাজ করে তবে সস্তা।
find 4.7.0-git
)।
ধরে নিচ্ছি যে আপনার সেকেন্ডে যথার্থতার প্রয়োজন নেই, এটি কাজ করা উচিত।
find . -type f -mmin -$(((`date +%s`-`date -d 20111222 +"%s"`)/60)) \! -mmin +$(((`date +%s`-`date -d 20111224 +"%s"`)/60))
সম্পাদনা: @ ইলেভেক্সের মন্তব্যের পরে
পরিবর্তন করা cmin
হয়েছে সম্পাদনা: '\!' অনুপস্থিতmmin
-cmin
"স্থিতি পরিবর্তন", -mmin
হ'ল "ডেটা পরিবর্তন"। আপনি সম্ভবত চান-mmin
find
আইএসও ফর্ম্যাট করা ডেটটাইম নিতে পারে, সুতরাং ইউটিসিতে একটি সার্ভারের জন্য উদাহরণস্বরূপ, আপনি যেখানেই থাকুন না কেন আপনি বেশ কয়েক ঘন্টার অফসেট নির্দিষ্ট করতে পারেন। আপনি সময়ের সাথে তুলনা করার কারণে এটি কোনও দিন যোগ করার বিষয়েও যত্নশীল:
find -type f -newermt 20111224T0800 \! -newermt 20111225T0800
দয়া করে নোট করুন যে প্রশ্নটি সদৃশ হিসাবে চিহ্নিত হয়েছে, এবং তাই এর সরাসরি উত্তর দেওয়া থেকে বিরত, কেন আমি এখানে পোস্ট করছি। এই উত্তরটি প্রশ্নের উত্তর দেওয়ার জন্য "তৈরির তারিখের ভিত্তিতে ফাইলগুলি বিভিন্ন ফোল্ডারে সরানো দরকার [সদৃশ]"
উত্তরগুলি যুক্তিসঙ্গত তবে খাঁটি সন্ধানের আদেশের সাথে কিছু সীমাবদ্ধতা ছিল। আমি এই শেল স্ক্রিপ্টটি এতগুলি ফাইল সহ একটি ডিরেক্টরিতে যেতে লিখেছিলাম যাতে ফাইল সিস্টেমটি মেটাডাটাতে একটি এলএস সঞ্চালনের চেষ্টা করছে g অতিরিক্তভাবে কিছু * নিক্স সিস্টেম চলমান এলএসের সাথে অনেকগুলি তর্ক ত্রুটিটি বারফ করবে।
ফাইন্ড কমান্ডটি খুব শক্তিশালী এবং তালিকাভুক্ত পদ্ধতিগুলির সাথে আমি শুরু করেছিলাম তবে আমার কাছে সেই ডিরেক্টরি জুড়ে এত বছরের ডেটা ছিল যে আমাকে বারবার সমস্ত ফাইলের মধ্যে দিয়ে যেতে হয়েছিল। এটি প্রতিটি ফাইলকে অতিক্রম করে অজস্র উত্পাদন করে produces আমি প্রতি বছর একটি পর্দা করার চেষ্টা করেছি এবং একাধিক খোঁজ চালানোর চেষ্টা করেছি তবে এর ফলে প্রতিটি অনুসন্ধান থেকে অনেক ত্রুটি ঘটেছিল এবং যখন ফাইলগুলির মধ্যে একটি সরিয়ে নিয়ে যায় তখন ফাইলগুলি নিখোঁজ হয়ে যায়।
আমার শেল স্ক্রিপ্টটি একটি 4 গানের বছর এবং 2 অঙ্কের মাস সহ গন্তব্য ডিরেক্টরিতে একটি ফাইল সরিয়ে দেয়। দু'টি লাইনকে সংশোধন করে এবং তাদের অংশগুলির মন্তব্য করে খুব সহজেই এটি 2 ডিজিটের দিনে বাড়ানো যেতে পারে। আমি বিশ্বাস করি এটি আরও দক্ষ কারণ এটি একাধিক ফাইন্ড কমান্ড এবং ডিরেক্টরিতে পাস অপরিবর্তিত রয়েছে এমন ফাইন্ডের এক পাসে পদক্ষেপগুলি সম্পাদন করে।
#!/bin/bash
#We want to exit if there is no argument submitted
if [ -z "$1" ]
then
echo no input file
exit
fi
#destDir should be set to where ever you want the files to go
destDir="/home/user/destination"
#Get the month and year of modification time
#--format %y returns the modification date in the format:
# 2016-04-26 12:40:48.000000000 -0400
#We then take the first column, split by a white space with awk
date=`stat "$1" --format %y | awk '{ print $1 }'`
#This sets the year variable to the first column split on a - with awk
year=`echo $date | awk -F\- '{print $1 }'`
#This sets the month variable to the second column split on a - with awk
month=`echo $date | awk -F\- '{print $2 }'`
#This sets the day variable to the third column split on a - with awk
#This is commented out because I didn't want to add day to mine
#day=`echo $date | awk -F\- '{print $3 }'`
#Here we check if the destination directory with year and month exist
#If not then we want to create it with -p so the parent is created if
# it doesn't already exist
if [ ! -d $destDir/$year/$month ]
then
mkdir -p $destDir/$year/$month || exit
fi
#This is the same as above but utilizes the day subdirectory
#Uncommented this out and comment out the similar code above
#if [ ! -d $destDir/$year/$month/$day ]
#then
# mkdir -p $destDir/$year/$month$day || exit
#fi
#Echoing out what we're doing
#The uncommented is for just year/month and the commented line includes day
#Comment the first and uncomment the second if you need day
echo Moving $1 to $destDir/$year/$month
#echo Moving $1 to $destDir/$year/$month/$day
#Move the file to the newly created directory
#The uncommented is for just year/month and the commented line includes day
#Comment the first and uncomment the second if you need day
mv "$1" $destDir/$year/$month
#mv "$1" $destDir/$year/$month/$day
একবার সংরক্ষণ ও সম্পাদনযোগ্য হয়ে গেলে আপনি এই স্ক্রিপ্টটি নীচের মত সন্ধানের সাথে কল করতে পারেন।
find /path/to/directory -type f -exec /home/username/move_files.sh {} \;
আপনাকে সন্ধানের জন্য নিউমার্ট বিকল্প নির্ধারণের বিষয়ে উদ্বিগ্ন হওয়ার দরকার নেই কারণ সমস্ত অনুসন্ধান সরবরাহ করে যা ফাইলগুলি পাওয়া যায় তার জন্য প্রতি একক প্রয়োগ এবং স্ক্রিপ্ট সমস্ত সিদ্ধান্ত নেয়।
মনে রাখবেন যে আপনি-টাইপ চ নির্বাচন না করে এটি ডিরেক্টরিগুলি স্থানান্তরিত করবে এবং এটি সমস্যার কারণ হতে পারে। আপনি কেবল ডিরেক্টরিগুলি স্থানান্তর করতে চাইলে আপনি টাইপ ডি ব্যবহার করতে পারেন। প্রকারটি সেট না করে প্রায় অবশ্যই অযাচিত আচরণ তৈরি করবে।
মনে রাখবেন এই স্ক্রিপ্টটি আমার প্রয়োজন অনুসারে তৈরি হয়েছিল । আপনার প্রয়োজনের স্ক্রিপ্টের জন্য আরও ভাল উপযুক্তের জন্য আপনি কেবল আমার নির্মাণটিকে অনুপ্রেরণা হিসাবে ব্যবহার করতে চাইতে পারেন। ধন্যবাদ!
বিবেচনাগুলি: স্ক্রিপ্টের মাধ্যমে সীমাহীন সংখ্যক আর্গুমেন্টকে পাস করার মাধ্যমে কমান্ডটির কার্যকারিতা অত্যন্ত উন্নত হতে পারে । আপনি যদি vari @ ভেরিয়েবলটি অতিক্রম করেন তবে এটি আসলে তুলনামূলক সহজ। এর কার্যকারিতা প্রসারিত করা আমাদের উদাহরণস্বরূপ সন্ধানের-এক্সেক + ফাংশন বা লিভারেজ এক্সার্গস ব্যবহার করতে দেয়। আমি তা দ্রুত বাস্তবায়ন করতে এবং নিজের উত্তরটির উন্নতি করতে পারি তবে এটি একটি শুরু।
যেহেতু এটি একটি শট স্ক্রিপ্টের অধিবেশন ছিল সেখানে সম্ভবত অনেকগুলি উন্নতি করা যেতে পারে। শুভকামনা!