特定のタイムスタンプを持つテキストファイルに保存されているファイル名のリスト

特定のタイムスタンプを持つテキストファイルに保存されているファイル名のリスト

私は次のテキストファイルに複数のファイル名を保存しました。new1.txtマイホームディレクトリで、ループを使用してファイルが存在するディレクトリ内のすべてのファイルを一覧表示します。これを実行するコマンドを作成できます。 while read in; do ls -lrt /newusr/home/logs/"$in"; done < new1.txt

これらのログは昨日生成されたものですが、昨日午後2時以降に生成されたファイルをすべて参照したいので、grepステートメントを挿入してみましたが、間違って書いたようです
while read in; do ls -lrt /prdusr/rhd/prdoper/opLogDir/"$in"; done < new1.txt | grep "Dec 18 {14-23}"。構文に問題があるか、それを達成する他の方法はありますか?

答え1

まず、正しいタイムスタンプを使用して参照タイムスタンプファイルを作成しますmtime

touch -d 2019-12-18T14:00 timestamp

次に、ファイルを解析し、各ファイルについて、ファイルが作成したばかりのファイルtimestampより最新であるかどうかをテストします。

while IFS= read -r name; do
    if [[ /prdusr/rhd/prdoper/opLogDir/$name -nt timestamp ]]; then
        printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
    fi
done <new1.txt

これは-ntファイルテストを使用してbash修正タイムスタンプを確認します(bashこのテストは1秒未満の精度では実行されません)。

POSIXツールの使用:

touch -d 2019-12-18T14:00 timestamp

while IFS= read -r name; do
    if [ -n "$( find "/prdusr/rhd/prdoper/opLogDir/$name" -newer timestamp )" ]
    then
        printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
    fi
done <new1.txt

これは反対の方法でテストしますfind。ファイルがファイルの後に変更された場合、見つかったパスが出力され、timestampシェルは出力を空でない文字列として検出して呼び出しますprintf

答え2

正規表現は数値比較ではなくテキストパターン用に設計されているため、フィルタリングされたタイムスタンプを使用して許容可能な時間範囲を取得することは容易ではありませんgrep(例:これと他の同様の質問)。

あなたの特定のケース、ステートメントを次のように変更できます。

grep -E "Dec 18 (1[4-9]|2[0123])"

grepただし、これにはGNUおよび「拡張正規表現」構文が必要であることに注意してください。検索に使用する構文リテラル文字列 {14-23}出力ラインに表示されますls

また、通常、解析の出力は次のようになりlsます。強くお勧めしませんこれは、ファイル名に異常な文字が含まれている場合、またはロケールの結果が異なるタイムスタンプ形式などの場合、多くのトラップがあるためです。たとえば、選択した方法は、過去1/2年以内に発生した修正時間を示すタイムlsスタンプの慣例的なタイムスタンプに完全に依存します。たとえば、オプションを使用する方Mon DD HH:MMが安全です(おそらく)。find-mtime-daystart

関連情報