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]
}
설명을 보려면 댓글을 읽어보세요.
달의 전체 이름을 사용했습니다. 약어로 변경해야 할 수도 있습니다.