data_extraction_check_03_02_2021.txt라는 파일이 있습니다. 날짜, 월, 연도 순으로 파일 이름에서 마지막 세 개의 값을 가져오려고 합니다. 그런 다음 해당 날짜와 현재 날짜 사이의 일수를 확인할 수 있도록 세 변수를 연결하고 날짜 형식으로 변환해야 합니다.
다음 명령을 사용하면 "data_extraction_check_03_02_2021.txt"라는 마지막 파일 이름을 얻습니다.
latest_file=$(ls -t | head -n 1)
echo $latest_file
다음 명령을 사용하여 date_last, Month_last 및 year_last를 얻으려고 했지만 "date_last: command not find" 오류가 발생했습니다.
date_last = echo "${latest_file}" | awk -F'[_.]' '{print $4}'
month_last = echo "${latest_file}" | awk -F'[_.]' '{print $5}'
year_last = echo "${latest_file}" | awk -F'[_.]' '{print $6}'
그 후 다음 명령을 사용하여 date_last, Month_last 및 year_last를 연결했습니다. 이것을 날짜 형식으로 변환하는 방법을 잘 모르겠습니다.
last_extracted_date=$(echo ${date_last}-${month_last}-${year_last})
답변1
당신의 임무가 잘못되었습니다. 선행 또는 후행 공백 문자가 있어서는 안 되며 =
명령 대체도 없어야 합니다.$(...)
date_last=$(echo "${latest_file}" | awk -F'[_.]' '{print $4}')
GNU를 사용하면 date
다음과 같이 일수를 계산할 수 있습니다.
date=$(echo "$latest_file" | awk -F'[._]' '{ print $6 "-" $5 "-" $4 }')
days=$(( ($(date +%s) - $(date +%s -d "$date")) / 86400 ))
echo "$days"
답변2
그리고 zsh
:
zmodload zsh/datetime
(){ latest=$1; } *_<1-31>_<1-12>_<1970->.txt(om)
strftime -rs t _%d_%m_%Y.txt ${(M)latest%_*_*_*}
strftime 'Date is %F' $t
print Age is $(( (EPOCHSECONDS - t) / 86400 )) days.
오늘 나에게(2021-02-22):
Date is 2021-02-03
Age is 19 days.
답변3
(문법적 오류는 제외됩니다.)
파일 이름이 일관되면 매개변수 대체를 대신 사용할 수 있습니다 awk
.
$ d="${latest_file: -8:4}-${latest_file: -11:2}-${latest_file: -14:2}"
$ echo "$d"
2021-02-03
답변4
그리고세게 때리다read
, 파일 이름을 구문 분석하는 데 사용할 수 있습니다
latest_file="data_extraction_check_03_02_2021.txt"
# Split the filename into the "parts" array: split on underscore or dot
IFS="_." read -ra parts <<<"$latest_file"
# Extract the date parts relative to the end of the array ([-1] is the last element)
epoch=$(date -d "${parts[-2]}-${parts[-3]}-${parts[-4]}" "+%s")
# EPOCHSECONDS is a bash builtin variable
days=$(( (EPOCHSECONDS - epoch) / 86400 ))
echo "$days days" # => "19 days"
또한 구문 분석을 피하는 것이 좋습니다 ls
(http://mywiki.wooledge.org/ParsingLs).
latest_file=$(
find . -maxdepth 1 -type f -printf "%T@\t%p\0" \
| sort -z -n \
| tail -z -n1 \
| cut -z -f2-
)