Bagaimana saya bisa mengonversi nama folder dari satu format tanggal ke format yang lain


10

Saya memiliki banyak folder, dinamakan sebagai tanggal seperti:

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

Saya ingin format tanggal berubah menjadi ini:

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

Bagaimana cara batch mengubah nama banyak folder dari DD MMM YYYYmenjadi YYYY-MM-DD?

Jawaban:


12

Agak mengherankan saya sendiri, sepertinya teman lama kita prename(alias renamepada beberapa sistem) dapat melakukan itu - dengan sedikit perselisihan:

$ 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

Atau, gunakan GNU 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

Menguji dengan echo(setara dengan tanda 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

Perhatikan bahwa penguraian tanggal dapat bergantung pada lokal.


9

datePerintah GNU sangat bagus dalam mengkonversi antara format tanggal yang berbeda. Sebagai contoh:

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

Dengan mengingat hal itu, jika satu-satunya hal dalam direktori target Anda adalah subdirektori yang ingin Anda ganti namanya, Anda dapat melakukannya:

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

Jika Anda ingin menentukan direktori saja , gunakan:

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

Dan untuk mencocokkan hanya direktori yang namanya dimulai dengan angka:

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

6

Berikut ini adalah skrip Python yang dapat melakukan penggantian nama menggunakan datetimemodul:

#!/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])

Mari kita sebut skripnya rename.py. Untuk menggunakan skrip, pertama-tama membuatnya dapat dijalankan dengan menjalankan chmod +x rename.pydan kemudian menjalankan di ./rename.py parent_dirmana parent_dirdirektori induk berisi semua direktori yang namanya ingin Anda ubah.


4

Berikut ini adalah skrip Ruby yang melakukan hal yang sama. Masukkan ini ke direktori di mana semua direktori tersebut berada.

#!/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

Gunakan chmod +x rename.rbdan ./rename.rbuntuk mengganti nama direktori


0

jika Anda menginginkan solusi GUI yang baik, coba pyrenamer dengan mudah dan sangat dapat dikonfigurasi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.