名前に日付を含むファイルをシステムの現在の日付と時刻と比較しようとしています。
ファイル名は次の形式に従います。
ファイル名.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
問題は、その種類のファイルが1つしかない場合、スクリプトが完全に機能することです。しかし、例えば、ファイルは同じですが、日付名が異なります。 (たとえば、同じディレクトリにあるFile156tr.20220913.1053.txtおよびFile156tr.20220914.0958.txt)lsコマンドはファイル名に両方の日付を印刷するため、このスクリプトは機能しません。
名前は同じですが、名前に日付/時刻が異なる複数のファイルがある場合(上記のように)、どのように印刷しますか?最新のもの(現在の日付に最も近いもの)のみ?
答え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
答え2
私が探しているスクリプトは、今日より古いすべてのファイルのうち最新のファイルのみを印刷する必要があります。
存在するファイル名のリストを作成し、現在の日付と一致する名前を削除してからリストをソートすることをお勧めします。リストの最後の項目が最新の項目です。あるいは、必要に応じて、リストの最初の項目が最新の項目になるように、リストを逆順に並べ替えることもできます。
パス部分に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