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