파일 이름을 바꾸고 날짜 스탬프를 'dd[st/nd/rd/th] mmm yyyy'에서 'yyyymmdd'로 변환하는 Bash 명령이 있습니까?

파일 이름을 바꾸고 날짜 스탬프를 'dd[st/nd/rd/th] mmm yyyy'에서 'yyyymmdd'로 변환하는 Bash 명령이 있습니까?

File Name 20th May 2019 descr.txt다음과 같은 파일 이름의 날짜 문자열을 일치시키고... (파일 이름과 설명은 가변 길이 문자열입니다)... 다음과 같은 파일 이름으로 변환할 수 있는 간단한 bash 명령이 있습니까 File_Name_20190520_descr.txt ?

날짜 기반 파일 이름 변환에 대해 논의하는 몇 가지 다른 질문이 있다는 것을 알고 있지만 Perl과 관련이 있거나 서수 지정자(1st, 2nd, 3rd, 4th)를 구체적으로 언급하지 않습니다.

답변1

그리고 zsh:

zmodload zsh/datetime
autoload zmv
zmv -n '(* )(<1-31>)??( ??? <1900-2100>)( *.txt)' \
  '${1// /_}$(strftime %Y%m%d "$(strftime -r "%d %b %Y" $2$3)")${4// /_}'

만족스러우면 제거하세요 -n.

월이 3자리 약어인 경우. 성명인 경우:

zmodload zsh/datetime
zmodload zsh/langinfo
autoload zmv
zmv -n '(* )(<1-31>)?? ('${(vj:|:)langinfo[(I)MON_*]}')( <1900-2100>)( *.txt)' \
  '${1// /_}$(strftime %Y%m%d "$(strftime -r "%d %B %Y" $2$3$4)")${5// /_}'

이는 파일 이름이 현재 로케일의 언어로 되어 있다고 가정합니다. 월 이름이 항상 영어인 경우 설정할 수 있습니다 LC_ALL=C. 아무튼, 언어가 영어가 아닌 경우 약어가 항상 3글자, 혹은 th, nd, 2글자 길이 일 것이라고 예상할 수는 없으므로 rd조정이 필요할 수도 있습니다.

답변2

이상한:

{
    # split by date
    split($0, a, /[0-9]{1,2}[a-z]{2} +(January|February|March|April|May|June|July|August|September|October|November|December) +[0-9]{4}/, seps)
    # remove trailing nth from day
    sub(/[a-z]{2}/, "", seps[1])
    # get desired date format from shell command
    "date -d '" seps[1] "' +%Y%m%d" | getline d
    # replace space with _
    gsub(/ +/, "_", a[1])
    gsub(/ +/, "_", a[2])
    print a[1] d a[2]
}

설명을 보려면 댓글을 읽어보세요.

달의 전체 이름을 사용했습니다. 약어로 변경해야 할 수도 있습니다.

관련 정보