독일어 "현재" 날짜가 포함된 디렉터리 이름을 YYYY-MM-DD로 변환합니다.

독일어 "현재" 날짜가 포함된 디렉터리 이름을 YYYY-MM-DD로 변환합니다.

Mac의 iPhoto에서 사진을 내보냈습니다. 디렉터리 이름은 로컬 이름 지정 날짜("Day.MONTH YYYY")를 따라 지정됩니다.

8. Mai 2013/
13. Juli 2013/
31. Oktober 2014/

그 중 일부는 GPS 데이터와 함께 제공됩니다.

Capdepera, 2. Juli 2013/
Stuttgart, 13. Februar 2013/
Marsa Alam, 31. Dezember 2011/

YYYY-MM-DD<.GPS-Data-if-exists> = 2013-07-02.Capdepera와 같은 디렉터리 이름을 원합니다.

cut -d',' -f1GPS 데이터와 -f2날짜 부분을 ($DatePart로) 분리 하겠습니다 . 두 번째 단계에서는 점 "."을 사용하여 날짜 부분을 일과 월 + 연도로 나눈 다음 마지막 4자리를 연도로 사용합니다. 그 후에는 내가 얻을 것이다

GPS="Capdepera"
DAY=02      # fill leading zero is no issue.
MONTH=Juli
YEAR=2013

이제 월을 숫자에 매핑하기 위해 다음과 같은 배열을 만듭니다.

Monate="
Januar=01\n
Februar=02\n
Juli=07\n
"

그 결과 echo -e $Monate | grep $MONTH| cut -d'=' -f207이 나왔습니다. 이제 모든 항목을 최종 디렉터리 이름에 연결하여 이름을 바꿀 수 있습니다.

이제 내 질문은: 위에서 설명한 것과 같은 더 쉬운 방법이 있습니까? 즉 -f2, SQL 함수 Convert()와 같은 날짜 변환은 첫 번째 단계에서 날짜 부분을 사용한 후 단계적으로 분할 및 배열 없이 결과를 제공합니다.

Convert("$DatePart", +%Y-%m-%d) => 2013-07-02

고마워요, 세랄

답변1

적절한 최신 버전의 Perl이 있는 경우 Perl 기반 rename유틸리티를 사용합니다(특히 이전 버전은 영어가 아닌 월 및 요일 이름을 구문 분석할 수 있는 방법을 Time::Piece제공하지 않습니다 ).use_locale

$ LC_TIME=de_DE.UTF-8 rename -n -- '
    BEGIN{use Time::Piece; Time::Piece->use_locale()};
    s/(.*?), (\d+\. \w+ \d+)/Time::Piece->strptime($2,"%d. %B %Y")->strftime("%Y-%m-%d.$1")/e
  ' *,\ */
rename(Capdepera, 2. Juli 2013/, 2013-07-02.Capdepera/)
rename(Marsa Alam, 31. Dezember 2011/, 2011-12-31.Marsa Alam/)
rename(Stuttgart, 13. Februar 2013/, 2013-02-13.Stuttgart/)

LC_TIME=de_DE.UTF-8해당 로캘에서 이미 독일어 날짜/시간을 사용하는 경우 이 할당을 생략할 수 있습니다. GPS 데이터 문자열이 없는 더 간단한 경우는 연습문제로 남겨둡니다.

관련 정보