폴더 이름을 한 날짜 형식에서 다른 날짜 형식으로 일괄 변환하는 방법


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

또는 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

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

GNU date명령은 다른 날짜 형식으로 변환하는 데 매우 능숙합니다. 예를 들면 다음과 같습니다.

$ 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모듈을 사용하여 이름을 바꿀 수있는 Python 스크립트입니다 .

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

동일한 작업을 수행하는 Ruby 스크립트가 있습니다. 이것을 모든 해당 디렉토리가 상주하는 디렉토리에 넣으십시오.

#!/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디렉토리의 이름을 바꾸려면


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.