আমি কীভাবে ফাইলের নাম টাইমস্ট্যাম্প পরিবর্তন করতে পারি?


8

কালানুক্রমিক ক্রমে আমার ফাইলের নাম রয়েছে:

FileName_YYYY_MM_DD_HHMM.dat

প্রতিটি টাইমস্ট্যাম্পে 30 মিনিট যুক্ত করার জন্য কি কোনও আদেশ রয়েছে?


1
এই টাইমস্ট্যাম্পগুলি কি তাদের তৈরির তারিখের মতো? এটা কি হিসাবে একই ls --full-time?
সের্গেই কোলোডিয়াজনি

1
না, টাইমস্ট্যাম্পগুলি তাদের তৈরি / পরিবর্তিত তারিখ হিসাবে আলাদা। টাইমস্ট্যাম্পগুলি সেই সময়ের উপর ভিত্তি করে ডেটা পরিমাপ করা হয়েছিল।
স্ট্রবেরি

1
দেখুন, যেহেতু সেই টাইমস্ট্যাম্পগুলি প্রথাগত, তাই এটির জন্য একটি স্ক্রিপ্টের প্রয়োজন হবে, যেটি তারিখে ৩০ মিনিট যোগ করার গণনা করতে হবে, কোনও সাধারণ কমান্ড হবে না। তাই লোকদের প্রতিক্রিয়া জানাতে কিছুটা সময় লাগতে পারে
সের্গি কলডিয়াজনি

1
মধ্যরাতের কাছাকাছি সময়ে এমন কোনও স্ট্যাম্প রয়েছে, যেমন ৩০ মিনিট যোগ করার ফলে একদিনের পরিবর্তনের প্রয়োজন হতে পারে?
সের্গেই কোলোডিয়াজনি

1
ঘন্টা কি ফর্ম্যাট? 12 তারপরে 1,2,3 (12 ঘন্টা ফর্ম্যাট) বা 12 থেকে 13 থেকে 14, 15। । । 23, 00 (24 ঘন্টা ফর্ম্যাট)?
সের্গেই কলডিয়াজনি

উত্তর:


6

ব্যবহার 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_time30 মিনিট থাকবে

  • os.rename সেই অনুসারে ফাইলটির নতুন নামকরণ করা হবে।

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


আপনি এবং অজগর, একটি দুর্দান্ত ভালবাসা। =) + 1
এবি

Filename_পুনরায় নামকরণের পদ্ধতিতে আপনার স্ট্রিংটি ব্যবহার করা উচিত নয় ।
এবি

@ এএব কেন? (আপনার জন্যও +1)
হেইমাইল

অজগর স্ক্রিপ্ট চালানোর পরে কেন আমার কিছু ফাইল অনুপস্থিত আছে জানেন? প্রতিটি ফাইলের টাইমস্ট্যাম্পে 30-মিনিটের পার্থক্য রয়েছে। নীচে প্রথম কয়েকটি ফাইলের নামের জন্য আউটপুট দেওয়া হয়েছে: ফাইল নাম_2011_01_11_1630.dat ফাইলের নাম_2011_01_11_1830.dat ফাইলের নাম_2011_01_11_1900.dat ফাইলের নাম_2011_01_11_2030.dat ফাইলের নাম_2011_01_11_2100.dat
স্ট্রবেরি ১১

@ স্ট্রাওয়ারবেরি আমি জানি না..এটি পরীক্ষা করে দেখেছি এবং কোন সমস্যা ছাড়াই আমার জন্য ভাল কাজ করেছে..আপনি কি স্ক্রিপ্টটি /path/to/fileডিরেক্টরিটির পুরো পথ দিয়ে প্রতিস্থাপন করেছেন ?
হিমাইল

2

ব্যবহার করে 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
এবি

অতিরিক্ত ফোল্ডারে নাম পরিবর্তন করা ফাইলগুলি সংরক্ষণ করার জন্য ভাল ধারণা। যদি কিছু খারাপ হয়ে যায় তবে ওপিতে এখনও অরিজিনাল রয়েছে। ভাল চিন্তাভাবনা, সুতরাং +1
সের্গেই কলডিয়াজহনি

ধন্যবাদ @AB আমি আপনার স্ক্রিপ্টটি চলমান পরে নিম্নলিখিত ত্রুটির করেছেন: TimeChange.sh: 21: TimeChange.sh: খারাপ প্রতিকল্পন আমার প্রকৃত ফাইলের নাম বা টাইমস্ট্যাম্প আগে সংশোধন করা হয়েছে উপসর্গ মত FileName_123.Data_YYYY_MM_DD_HHMM.dat হয়
strawberrie

প্রতি সংজ্ঞা, FileName_123.Data_YYYY_MM_DD_HHMM.datঅংশ .Data_YYYY_MM_DD_HHMM.datজন্য এক্সটেনশন। এবং তাই FileName_123কোনও বৈধ টাইমস্ট্যাম্প নয়।
এবি

@ স্ট্রাবেরি আমার স্ক্রিপ্ট পরিবর্তন হয়েছে
এবি

1

লিপি

এটি আমার মূল লিপির সম্পাদিত সংস্করণ। ওপি মূলত নামকরণের ফর্ম্যাট সম্পর্কে সম্পূর্ণ তথ্য দেয়নি। এই স্ক্রিপ্টটি মন্তব্যে উল্লিখিত যা সঠিক ফাইলের নামকরণের সাথে খাপ খাইয়ে নিয়েছে।

* প্রযুক্তিগত নোট: *

এই স্ক্রিপ্টে আমরা ফাইলনামকে ফিল্ড ডিলিমেটার হিসাবে আন্ডারস্কোর সহ অ্যাজ্ক ব্যবহার করে 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


ওয়ে, এলএস | ডাব্লুসি-এল এর আগে 36 ফাইল দেয়, এবং স্ক্রিপ্টের পরেও 36 টি ফাইল দেয়,
কোনওটিই

এছাড়াও, আমি স্ট্যাটাস-সি% এন ফাইলটি ব্যবহার করার কারণ, কারণ সাধারণত ls এর আউটপুট পার্স করা ভাল ধারণা নয়। কিছু লোক findকমান্ড ব্যবহার করে , এটিও ভাল।
সের্গেই কোলোডিয়াজনি

ধন্যবাদ @ সার্জ আমি জানি না কেন আমি আপনার স্ক্রিপ্টটি চালানোর পরে 72২7 টি ফাইলের মধ্যে কেবল দুটি ফোল্ডারে রেখেছি ...
স্ট্রবেরি

প্রকৃত ফাইলের নাম এবং আপনার পোস্ট করা উদাহরণের মধ্যে কোনও পার্থক্য ছিল?
সের্গেই কোলোডিয়াজনি

এছাড়াও, আপনি "স্ক্রিপ্ট ইন অ্যাকশন" -তে প্রথম লাইনটি চালিয়েছেন? আরএম * ছিল আমার নিজের ডিরেক্টরিটি পরিষ্কার করার জন্য এবং তারপরে ফাইলের নামে বিভিন্ন তারিখ সহ পরীক্ষার ফাইলগুলির গুচ্ছ তৈরি করার জন্য। আপনি এটি চালানোর কথা ছিল না
সের্গেই কলডিয়াজন্য

-1

আপনার যা অনুমান করা দরকার তা করতে আপনি এই কোডটি ব্যবহার করতে পারেন

  1. আপনার ব্যাকআপ নেওয়া উচিত এবং কোডটি আপনার ক্ষেত্রে উপযুক্ত কিনা তা দেখতে প্রথমে এটি পরীক্ষা করা উচিত
  2. আপনি 24 এইচ ফর্ম্যাটটি ব্যবহার করছেন
  3. কোনও ফাইলের নামকরণ করা হবে না ২৩: ২৯ এর পরে (যদি আপনার পরে ফাইল থাকে তবে কোডটিও পরিবর্তন করতে হবে তারিখটি পরিবর্তন করতে হবে)

কোডটি হ'ল:

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নামের অংশ


ভোটারদের নিচে দয়া করে কারণটি জানান?
ফ্যাট মাইন্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.