ここからこの演習を見つけました
grep を使用して、10 時間以内に変更されたホーム ディレクトリ内のファイルのリストを作成します。ただし、ディレクトリは除外します。
コマンドを使用するのは簡単なことのように思えますが、コマンドを使用して過去 10 時間以内に変更されたファイルを見つけるfind
にはどうすればよいでしょうか?grep
ありがとう!
わかりました、これは嫌悪感ですが、これは演習であり、私は興味がありました. 正規表現は単純すぎる可能性がありますが、私のテスト ケースでは機能します。ここでの「トリック」は、「ls」の代わりに「stat」を使用していることです。「stat」を使用すると、特定のフィールド (最終更新日を含む) をリクエストして、出力をフォーマットできます。ここでは、現在のタイムスタンプを取得し、10 時間前にさかのぼって、モード用にフォーマットされた統計情報を文字列形式で、変更された日付のタイムスタンプとファイル名を grep で収集しています。
sh-3.2$ date "+%s"
1373170496
sh-3.2$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1373170496-36000
1373134496
sh-3.2$ stat -f"%Sp %m %N" * | grep "^[\-].*13731[3-7][0-9][0-9][0-9][0-9].*$"
-rw-r--r-- 1373168941 fileAB
-rw-r--r-- 1373168944 fileAC
ここで、fileAB と fileAC は、いくつかの代表的なデータのために触れた 2 つの空のファイルです。一致は stat 出力を示しています。これは、man ページでよりよく説明されています。
この質問は、Bash Guide for Beginnersの第 4 章正規表現から取られています。これは実際的な問題ではありません。明らかに正規表現を実行するためのものですが、ややひねった方法です。さらに、この本は The Linux Documentation Project のサイトでホストされているため、通常のツールの GNU 実装を使用して、これを Linux に実装することを想定してもおそらく安全です。
grep
(少し)を使用した私のソリューションは次のとおりです。
ls -algG --time-style=+%s | grep ^[^d] | awk -vlimit=$(date +%s -d '10 hours ago') '$4 > limit { print substr($0, index($0, $4) + length($4) + 1) }'
説明:
ls
非表示のファイルを含むすべてのファイルを一覧表示する ( -a
)、ロング フォーマットを使用する ( -l
)、所有者とグループの情報を省略する ( -g
、-G
)、および によって解釈されたかのように時刻をフォーマットする、1970-01-01 00:00:00 からの秒数date
を意味します。 %s
UTCgrep
文字「d」以外で始まる行に一致し、実質的にディレクトリを除外しますawk
にパイプします。率直に言って、「10 時間以内」を表す日付に一致する正規表現を曲げる合理的な方法がないためです。現実の世界では、正規表現を使用せずに、この問題を次のように解決します。
touch marker.touch -d '10 hours ago'
find . -newer marker.touch -maxdepth 1 -type f