Làm cách nào tôi có thể chuyển đổi hàng loạt tên thư mục từ định dạng ngày này sang định dạng khác


10

Tôi có một số lượng lớn các thư mục, được đặt tên là ngày như vậy:

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

Tôi muốn định dạng ngày thay đổi thành này:

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

Làm thế nào tôi có thể đổi tên hàng loạt rất nhiều thư mục từ DD MMM YYYYđể YYYY-MM-DD?

Câu trả lời:


12

Một chút ngạc nhiên của riêng tôi, có vẻ như người bạn cũ của chúng tôi prename(còn gọi là renametrên một số hệ thống) có thể làm điều đó - với một chút lộn xộn:

$ 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

Ngoài ra, sử dụng 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

Kiểm tra với một echo(tương đương với -ncờ của tê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

Lưu ý rằng phân tích ngày có thể phụ thuộc vào miền địa phương.


9

Lệnh GNU daterất tốt trong việc chuyển đổi giữa các định dạng ngày khác nhau. Ví dụ:

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

Với ý nghĩ đó, nếu những thứ duy nhất trong thư mục đích của bạn là các thư mục con bạn muốn đổi tên, bạn chỉ cần làm:

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

Nếu bạn muốn chỉ định thư mục duy nhất , sử dụng:

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

Và để chỉ khớp với các thư mục có tên bắt đầu bằng một số:

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

6

Đây là tập lệnh Python có thể thực hiện đổi tên bằng datetimemô-đun:

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

Hãy gọi kịch bản rename.py. Để sử dụng tập lệnh, trước tiên hãy làm cho nó có thể thực thi được bằng cách chạy chmod +x rename.pyvà sau đó chạy ./rename.py parent_dirở đâu parent_dirlà thư mục mẹ chứa tất cả các thư mục có tên bạn muốn thay đổi.


4

Đây là một kịch bản Ruby thực hiện điều tương tự. Đặt cái này vào thư mục chứa tất cả những thư mục đó.

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

Sử dụng chmod +x rename.rb./rename.rbđổi tên các thư mục


0

Nếu bạn muốn một giải pháp GUI tốt, hãy thử pyrenamer dễ dàng và rất cấu hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.