কালানুক্রমিক ক্রমে আমার ফাইলের নাম রয়েছে:
FileName_YYYY_MM_DD_HHMM.dat
প্রতিটি টাইমস্ট্যাম্পে 30 মিনিট যুক্ত করার জন্য কি কোনও আদেশ রয়েছে?
কালানুক্রমিক ক্রমে আমার ফাইলের নাম রয়েছে:
FileName_YYYY_MM_DD_HHMM.dat
প্রতিটি টাইমস্ট্যাম্পে 30 মিনিট যুক্ত করার জন্য কি কোনও আদেশ রয়েছে?
উত্তর:
ব্যবহার python
:
#!/usr/bin/env python2
import glob, re, os, datetime
os.chdir('/path/to/dir')
for f in glob.glob('*.dat'):
ini_time = datetime.datetime.strptime(re.search(r'(?<=_)(?:\d|_)+(?=.dat$)', f).group(), '%Y_%m_%d_%H%M')
fin_time = (ini_time + datetime.timedelta(minutes=30)).strftime('%Y_%m_%d_%H%M%S')
os.rename(f, 'Filename_' + str(fin_time) + '.dat')
os.chdir('/path/to/dir')
বর্তমান ডিরেক্টরিটি .dat
ফাইলগুলি উপস্থিত ডিরেক্টরিতে পরিবর্তন করবে । /path/to/dir
আসল পথ দিয়ে প্রতিস্থাপন করুন ।
glob.glob('*.dat')
ফাইলগুলি শেষ হয়ে যাবে .dat
ini_time
ভেরিয়েবল প্রথমে re
মডিউলটি ব্যবহার করে মূল ফাইলের নাম থেকে তারিখের সময়টি কেটে ফেলবে এবং তারপরে কোন এন্ট্রিটিকে স্ট্রিংয়ের বাইরে যা বের করা হয় তা উপস্থাপন করে যাতে আমরা এতে প্রয়োজনীয় সময় যুক্ত করতে পারি
fin_time
ফলস্বরূপ সময় অন্তত ini_time
30 মিনিট থাকবে
os.rename
সেই অনুসারে ফাইলটির নতুন নামকরণ করা হবে।
আরও মনে রাখবেন যে একের পর এক ফাইল নামের সাথে (30 মিনিটের দ্বারা পৃথক) পুনরায় নামক ফাইলটি পরের ফাইলটিকে ওভাররাইট করে দেবে, তাই এটি নিরাপদ থাকায় সেকেন্ড যুক্ত করে নাম দেওয়া ফাইলের নাম যুক্ত করা ভাল। অন্যথায় আপনার নাম পরিবর্তন করা ফাইলগুলি একটি অন্য ডিরেক্টরিতে সংরক্ষণ করতে হবে এবং তারপরে সেগুলি পরে মূল ফাইলগুলির সাথে প্রতিস্থাপন করতে হবে।
Filename_
পুনরায় নামকরণের পদ্ধতিতে আপনার স্ট্রিংটি ব্যবহার করা উচিত নয় ।
/path/to/file
ডিরেক্টরিটির পুরো পথ দিয়ে প্রতিস্থাপন করেছেন ?
ব্যবহার করে bash
, নাম পরিবর্তন করা ফাইলগুলি একটি নতুন সাব ফোল্ডারে রয়েছে renamed
।
ফাইলগুলি যেখানে ফোল্ডারে রয়েছে সেখানে স্ক্রিপ্টটি শুরু করুন।
#!/bin/bash
mkdir -p renamed
# loop over all dat files in the current folder
for f in *.dat; do
# the filename without extension
filename="${f%%.*}"
# your timestamp
old_timestamp=$(echo $filename | grep -P "[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}$")
if [ "$old_timestamp" == "" ]; then
>&2 echo "not a valid filename: '$f', skipped."
else
# a valid date from the timestamp
new_date=$(echo "$old_timestamp" | awk -F_ '{HM=NF; D=NF-1; M=NF-2; Y=NF-3; print $Y "-" $M "-" $D " " substr($HM,1,2) ":" substr($HM,3,2) ":00"}')
# the new time stamp, 30 mins in the future
changed_timestamp=$(date --date "$new_date 30 minutes" "+%Y_%m_%d_%H%M")
# copy the file, ${f##*.} is the extension
cp "$f" renamed/"${filename/$old_timestamp/$changed_timestamp.${f##*.}}"
fi
done
উদাহরণ আউটপুট:
% ls -og FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2235.dat
% ./timestamp
% ls -og renamed/FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2305.dat
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.dat
অংশ .Data_YYYY_MM_DD_HHMM.dat
জন্য এক্সটেনশন। এবং তাই FileName_123
কোনও বৈধ টাইমস্ট্যাম্প নয়।
লিপি
এটি আমার মূল লিপির সম্পাদিত সংস্করণ। ওপি মূলত নামকরণের ফর্ম্যাট সম্পর্কে সম্পূর্ণ তথ্য দেয়নি। এই স্ক্রিপ্টটি মন্তব্যে উল্লিখিত যা সঠিক ফাইলের নামকরণের সাথে খাপ খাইয়ে নিয়েছে।
* প্রযুক্তিগত নোট: *
এই স্ক্রিপ্টে আমরা ফাইলনামকে ফিল্ড ডিলিমেটার হিসাবে আন্ডারস্কোর সহ অ্যাজ্ক ব্যবহার করে separate টি পৃথক ক্ষেত্রে পৃথক করি। প্রথম দুটি ক্ষেত্র, $ 1 এবং $ 2 স্ট্যাটিক পাঠ্য স্ট্রিং হিসাবে বিবেচনা করা হয়। ক্ষেত্রসমূহ 3,4,5 এবং 6 টাইমস্ট্যাম্প যা ওপি ডেটা নমুনা ছিল, হয় না ফাইলসিস্টেম ফাইল সৃষ্টির তারিখ।
চলক কপিডির নতুন ডিরেক্টরিতে নাম রয়েছে যেখানে আপডেট টাইমস্ট্যাম্প সহ ফাইলগুলি যাবে। আমরা বর্তমান ওয়ার্কিং ডিরেক্টরিতে সেই ডিরেক্টরিটি তৈরি করিmkdir $COPYDIR
ভেরিয়েবলগুলি টেক্সট্রাস্টিং এবং তারিখগুলি স্থিরভাবে পাঠ্য এবং টাইমস্ট্যাম্প ধারণ করে। নমুনা আউটপুট বেলোতে আমি দুটি পৃথক স্ট্রিং ব্যবহার করেছি প্রমাণ করার জন্য যে স্ক্রিপ্টটি প্রথম দুটি ক্ষেত্রের কোন পাঠ্য ধারণ করে তা নির্বিশেষে কাজ করবে script
NEWEPOCHTIME পরিবর্তনশীল যা ইউনিক্স যুগের ফর্ম্যাটে গণনা করা নতুন টাইমস্ট্যাম্প ধারণ করে। নতুন আপডেটটি পরিবর্তনশীল যা ইউনিক্সের যুগ থেকে YYYY-MM-DD HH: MM ফর্ম্যাটে রূপান্তরিত টাইমস্ট্যাম্প ধারণ করে। NEWAPPEND হ'ল আসল টাইমস্ট্যাম্প যা ওপির পছন্দসই YYYY_MM_DD_HHMM ফর্ম্যাটে ফাইলটিতে যুক্ত হবে।
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat
আপডেট করা ডেটাস্ট্যাম্পের সাহায্যে পুরানো ফাইলটিকে "রূপান্তর_ফায়ালস" ডিরেক্টরিতে অনুলিপি করে (সরানোর পরিবর্তে, ডেটা ক্ষতি রোধ করতে)।
লক্ষ্য করুন , স্ক্রিপ্ট যতদিন নামকরণ ফরম্যাট কাজ করবে সত্যিই অনুসরণ অর্থাত, সমস্ত ফাইল হয় সত্যিই আছে SomeText_123.Data_YYYY_MM_DD_HHMM.dat
বিন্যাস।
#!/usr/bin/env bash
#
# Author: Serg Kolo
# Description: this script takes timestamp within the filename
# (which may be different from file's actual creation date)
# converts that date and time to unix's epoch time
# adds 30 minutes to it and renames it
COPYDIR="converted_files"
mkdir $COPYDIR
for file in *.dat; do
TEXTSTRING=$(stat -c %n $file | awk -F'_' '{print $1"_"$2"_"}' )
DATESTRING=$( stat -c %n $file | awk -F'_' '{gsub(".dat",""); print $3"-"$4"-"$5" "$6}' )
NEWEPOCHTIME=$( expr $( date --date="$DATESTRING" +%s ) + 1800 )
NEWDATE=$(date --date=@"$NEWEPOCHTIME" +%F"_"%R)
NEWAPPEND=$(echo $NEWDATE | awk '{gsub("-","_");gsub(":","");print}')
cp $file "$COPYDIR"/"$TEXTSTRING""$NEWAPPEND".dat
done
কর্মে স্ক্রিপ্ট
বিক্ষোভ বেলো আমার টার্মিনাল থেকে সরাসরি অনুলিপি। লক্ষ্য করুন যে আমি প্রথম দুটি ক্ষেত্রে দুটি ভিন্ন স্ট্রিং সহ মূল ফাইলগুলি তৈরি করেছি। সুতরাং এই স্ক্রিপ্টটি ফাইলনামের শুরুতে যতক্ষণ না আন্ডারস্কোর দ্বারা দুটি মাত্র স্ট্রিং পৃথক রয়েছে কেবল তার কাজ করা উচিত
স্ক্রিপ্টটির নামকরণ করা হয়েছিল notes-conversion
কারণ এই প্রশ্নটিতে কাজ করার সময় আমি যে নোটগুলি নিয়েছিলাম সেগুলি থেকে স্ক্রিপ্টটি বিকাশ করেছি।
লক্ষ্য করুন যে ফাইলের নামগুলির মধ্যে এইচএইচএমএম অংশ রয়েছে 2345 হিসাবে (যা মধ্যরাতের 15 মিনিট আগে) আপডেট হয়েছে এবং তার সাথে ডিডি অংশটি পরের দিন আপডেট করা হবে। 24 ঘন্টা বিন্যাস সংরক্ষণ করা।
এছাড়াও, লুপের জন্য কেবল .dat
ফাইলগুলির সন্ধান করা হয়, তাই আমরা অন্য ফাইল বা ডিরেক্টরিগুলির নাম পরিবর্তন করা যা কার্যকরী ডিরেক্টরিতে থাকতে পারে, যাতে কোনও সম্ভাব্য ডেটা ক্ষতি এড়ানো যায়। নমুনা উদাহরণস্বরূপ, মূল ডিরেক্টরিটি 11 টি আইটেম ধারণ করে যার মধ্যে 3 টি *.txt
পরীক্ষার জন্য ফাইল, সুতরাং আমরা কেবল 8 টি .dat
ফাইল নিয়ে কাজ করি । যে ডিরেক্টরিগুলিতে আপডেট হওয়া ফাইল রয়েছে সেখানে আমরা 8 টি ফাইল দেখি, সমস্ত .dat
এবং অন্য কোনও ফাইল। ডেটা নিরাপদ, স্ক্রিপ্ট তার কাজ করে।
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
85 $ ls
FileName_123.Dat_2015_05_31_1245.dat Test.txt
FileName_123.Dat_2015_05_31_2345.dat YoloSwag_123.Dat_2015_05_31_1245.dat
FileName_Foo.Bar_2015_05_31_1245.dat YoloSwag_123.Dat_2015_05_31_2345.dat
FileName_Foo.Bar_2015_05_31_2345.dat YoloSwag_Foo.Bar_2015_05_31_1245.dat
File.txt YoloSwag_Foo.Bar_2015_05_31_2345.dat
Random.txt
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
86 $ ls | wc -l
11
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
87 $ notes-conversion
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
88 $ ls converted_files/; ls converted_files/ | wc -l
FileName_123.Dat_2015_05_31_1315.dat YoloSwag_123.Dat_2015_05_31_1315.dat
FileName_123.Dat_2015_06_01_0015.dat YoloSwag_123.Dat_2015_06_01_0015.dat
FileName_Foo.Bar_2015_05_31_1315.dat YoloSwag_Foo.Bar_2015_05_31_1315.dat
FileName_Foo.Bar_2015_06_01_0015.dat YoloSwag_Foo.Bar_2015_06_01_0015.dat
8
[67 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
89 $
ব্যাখ্যা (মূল পোস্ট থেকে)
*) আজ আমি শিখেছি যে ইউনিক্স-লিনাক্স সিস্টেমগুলি ইপচের সময়ে সময় গণনা করে , বা কেবল কয়েক সেকেন্ড রেখে।
*) স্ক্রিপ্টটি প্রতিটি ফাইলের নাম নেয়, তারিখ আহরণ করে, এটিকে মহাকাশে রূপান্তরিত করে, 1800 সেকেন্ড যোগ করে (যা ঠিক 30 মিনিট), এবং নতুন টাইমস্ট্যাম্পের চেয়ে ফাইলটি সংরক্ষণ করে।
*) এই স্ক্রিপ্টটি ওপি যা চেয়েছিল তা সম্বোধন করে - ফাইলনেমে টাইমস্ট্যাম্প পরিবর্তন করে, ফাইলের তৈরির সময় আপডেট করে না
ব্যবহৃত সরঞ্জামগুলি:
উবুন্টু 15.04
জিএনইউ বাশ 4.3.30
জিএনইউ অবাক ৪.১.১
তারিখ (জিএনইউ কোর্টিলস) 8.23
find
কমান্ড ব্যবহার করে , এটিও ভাল।
আপনার যা অনুমান করা দরকার তা করতে আপনি এই কোডটি ব্যবহার করতে পারেন
কোডটি হ'ল:
cd /path/to/the/files
for i in `ls`; do MM=${i:(-6): -4}; HH=${i: -8 : -6 }; NAME=${i: 0 : -8 } ; if [ "$MM" -lt 30 ] ; then NEWMM=$((10#$MM+30)); mv -f $i $NAME$HH$NEWMM.dat ; else NEWHH=$((10#$HH+1));NEWMM=$((10#$MM-30)) ; mv -f $i $NAME$NEWHH$NEWMM.dat ; fi ; done ;
এটি কীভাবে কাজ করে:
কোড ফাইলের মিনিটের অংশটি যাচাই করবে MM
তারপরে যদি এটি 30 এর কম হয় MM
তবে এটি 30 এর সাথে যোগ হবে যদি এটি 30 বা তার বেশি হয় তবে HH
এটি নামের অংশটিতে 1 ঘন্টা যোগ করবে এবং এর থেকে 30 মিনিট বাদ দেবে MM
নামের অংশ
ls --full-time
?