파일 이름에서 날짜, 월, 연도를 가져와 날짜 형식으로 변환

파일 이름에서 날짜, 월, 연도를 가져와 날짜 형식으로 변환

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-
)

관련 정보