data_extraction_check_03_02_2021.txtというファイルがあります。日付、月、年順にファイル名から最後の3つの値を取得しようとしています。次に、その日付と現在の日付の間の日数を確認できるように、3つの変数を連結して日付形式に変換する必要があります。
次のコマンドを使用すると、「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-
)