मैं एक तारीख प्रारूप से दूसरे में फ़ोल्डर नामों को कैसे बदल सकता हूं


10

मेरे पास बड़ी संख्या में फ़ोल्डर हैं, जिन्हें तारीखों के रूप में नामित किया गया है:

10 Aug 2010  15 Sep 2010  20 Jun 2010  25 Jul 2010  6 Nov 2010
10 Sep 2010  16 Aug 2010  20 Mar 2010  26 Aug 2010  6 Oct 2010
11 Apr 2010  16 Jun 2010  21 Jun 2010  28 Aug 2010  7 Apr 2010
12 Aug 2010  16 Oct 2010  21 Mar 2010  28 Feb 2010  7 Aug 2010
13 May 2010  17 Apr 2010  22 Feb 2010  28 Jun 2010  7 Jun 2010
14 Aug 2010  17 Aug 2010  23 Jul 2010  28 Mar 2010  8 Apr 2010
14 Jun 2010  18 Aug 2010  24 Jul 2010  29 Mar 2010  8 Aug 2010
15 Aug 2010  19 Aug 2010  24 Nov 2010  30 Aug 2010  8 Jul 2010
15 Jul 2010  4 Apr 2010  25 Apr 2010  6 May 2010   8 Sep 2010

मैं चाहता हूं कि यह तारीख बदलने के लिए प्रारूप:

2010-04-04  2010-05-03
2010-06-06  2010-07-02
2010-07-05  2010-09-01
2010-09-04  2010-09-05
2010-11-01

मैं कैसे बैच से फ़ोल्डरों का एक बहुत नाम बदल सकते हैं DD MMM YYYYकरने के लिए YYYY-MM-DD?

जवाबों:


12

कुछ हद तक मेरे अपने आश्चर्य की बात है, यह हमारे पुराने दोस्त prename( renameकुछ सिस्टम पर उर्फ ) की तरह लग रहा है - थोड़ा संघर्ष के साथ -

$ prename -vn -- '
  BEGIN{use Time::Piece};
  s/\d+ \w+ \d+/Time::Piece->strptime($&, "%d %b %Y")->strftime("%Y-%m-%d")/e
' *
10 Aug 2010 renamed as 2010-08-10
8 Sep 2010 renamed as 2010-09-08

वैकल्पिक रूप से, जीएनयू का उपयोग करना date

dirs=( ?\ ???\ ???? ??\ ???\ ???? ) # matches D MMM YYYY and DD MMM YYYY

for d in "${dirs[@]}"; do mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done

echo(Prename के -nझंडे के बराबर ) के साथ परीक्षण :

$ for d in "${dirs[@]}"; do echo mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done
mv -v -- 8 Sep 2010 2010-09-08
mv -v -- 10 Aug 2010 2010-08-10

ध्यान दें कि तारीखों का पार्सिंग स्थानीय निर्भर हो सकता है।


9

dateविभिन्न तिथि प्रारूपों के बीच परिवर्तित करने के लिए GNU कमांड बहुत अच्छा है। उदाहरण के लिए:

$ date -d '17 Aug 2010' +%F
2010-08-17

इस बात को ध्यान में रखते हुए, यदि आपकी लक्ष्य निर्देशिका में केवल वही चीज़ें हैं, जिन्हें आप बदलना चाहते हैं, तो आप बस कर सकते हैं:

for d in *; do mv "$d" "$(date -d "$d" +%F)"; done

यदि आप केवल निर्देशिका निर्दिष्ट करना चाहते हैं , तो उपयोग करें:

for dir in */; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

और केवल निर्देशिकाओं का मिलान करने के लिए जिनका नाम किसी संख्या से शुरू होता है:

for dir in [0-9]*/; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

6

यहाँ एक पायथन स्क्रिप्ट है जो datetimeमॉड्यूल का उपयोग करके नाम बदल सकती है :

#!/usr/bin/env python

from datetime import datetime
import os
import os.path
import sys


def main(target):
    dir_path = os.path.abspath(target)
    for i in os.listdir(target):
        old_name = os.path.join(dir_path, i)
        d = datetime.strptime(i, '%d %b %Y').strftime('%Y-%m-%d')
        new_name = os.path.join(dir_path, d)
        os.rename(old_name, new_name)

if __name__ == '__main__':
    main(sys.argv[1])

चलो स्क्रिप्ट को बुलाओ rename.py। स्क्रिप्ट का उपयोग करने के लिए, पहले यह चलाकर निष्पादन योग्य बनाने के chmod +x rename.pyलिए और फिर से चल रहा है ./rename.py parent_dir, जहां parent_dirसभी निर्देशिकाओं जिनके नाम आप बदलना चाहते हैं, मूल निर्देशिका है।


4

यहाँ एक रूबी लिपि है जो यही काम करती है। इसे उस डायरेक्टरी में डालें जहाँ वो सभी डायरेक्टरी रहती है।

#!/usr/bin/env ruby

require 'time'

Dir.glob('*').select do |f|
    if File.directory? f
        time = Time.parse(f.to_s)
        File.rename(f, time.strftime("%Y-%m-%d"))
    end
end

का प्रयोग करें chmod +x rename.rbऔर ./rename.rbनिर्देशिका का नाम बदलने का


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.