私は次のテキストファイルに複数のファイル名を保存しました。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