Linux
腳本 - 將文件名日期與目前日期進行比較
我正在嘗試將名稱中帶有日期的文件與系統的目前日期時間進行比較:
文件名採用以下格式:
FileName.yyyymmdd.hhmm.file(例如 File156tr.20220914.0958.txt)
我想出了以下腳本:
#!/bin/bash FROM_FILE=$(ls -1 /some/directory/File156tr.*.*.txt | grep -Eo '[[:digit:]]{8}') NOW=$(date +"%Y%m%d") DIFFERENCE=$((NOW - FROM_FILE)) if [ $DIFFERENCE -ge 1 ]; then echo "There are files that are older than today's date" fi
問題是當那裡只有一個類型的文件時,腳本可以完美執行。但是例如,如果我們有相同的文件,但名稱中的日期不同 (例如 File156tr.20220913.1053.txt 和 File156tr.20220914.0958.txt 在同一目錄中),則腳本將無法工作,因為 ls 命令將列印兩個日期在文件名中。
如果有多個文件具有相同的名稱,但名稱中的日期時間不同(如上所述),我如何只列印其中最新的一個(更接近目前日期的那個)?
我正在尋找的腳本必須只列印所有比今天更舊的文件中的最新文件。
我建議您簡單地建構一個存在的文件名列表,刪除與目前日期匹配的名稱,然後對列表進行排序。列表中的最後一個條目是最新的。或者,如果您願意,可以按相反的順序對列表進行排序,列表中的第一個條目是最新的。
假設您在路徑部分沒有任何
YYYYMMDD
日期字元串/some/directory/
,那麼簡單的事情可能會起作用:#!/usr/bin/env bash mr="$( for f in /some/directory/File156tr.*.*.txt do [[ -f "$f" ]] && printf '%s\n' "$f" done | sort -r | egrep -v "$(date "+%Y%m%d")" | head -1 )" if [[ -z "$mr" ]] then printf 'There are no files prior to today.\n' else printf 'The most recent file prior to today is "%s"\n' "$mr" fi
此程式碼遍歷與萬用字元匹配的所有文件,連接所有文件名並將它們傳遞給
sort
.sort
將它們按降序排序,並刪除任何包含YYYYMMDD
與今天日期匹配的字元串的文件名。的輸出通過sort
管道head -1
僅返回排序最高的單個文件名,或者如果沒有比今天更舊的文件,則可能返回空字元串。
這就是循環的用途:
#!/bin/bash for FILE in /some/directory/File156tr.*.*.txt do FROM_FILE=$(echo $FILE | grep -Eo '[[:digit:]]{8}') NOW=$(date +"%Y%m%d") DIFFERENCE=$(($NOW - $FROM_FILE)) if [ $DIFFERENCE -ge 1 ]; then echo "There are files that are older than today's date" fi done