从文件名中获取日期、月份、年份并将其转换为日期格式

从文件名中获取日期、月份、年份并将其转换为日期格式

我有一个名为 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}')

使用 GNUdate你可以这样计算天数:

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"

此外,建议避免解析lshttp://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-
)

相关内容