指定した更新日付の範囲内であるものを検索する方法を教えてください。
できればワンライナだとうれしいです。
「XX日前」とかではなくて、「2008/03/01 00:00:00から2008/03/10 00:00:00まで」
のような指定をしたいというのがポイントです。
findコマンドの-newerコマンドと、touch -t でなんとかしようと試みたのですが、
思いつかなかったので、質問させていただきました。
よろしくお願いします。
lsとegrepを使ってはどうでしょうか。
たとえば 2007/10/10 00:00 - 2007/12/09 23:59 の間の hoge ディレクトリ以下のファイルをリストアップするなら、下記のようになります。
日本語化されたディストリビューションではlsの出力が違うので、正規表現の部分を適宜アレンジしてください。
ls -Rl hoge/ | egrep '(Oct [1-3][0-9])|(Nov [0-3][0-9])|(Dec 0[0-9]) 2007'
touch と find というアイデアでいけると思います。
touch -t 古い方の日時 /tmp/oldstamp
touch -t 新しい方の日時 /tmp/newstamp
find . -newer /tmp/oldstamp -a \! -newer /tmp/newstamp -print
rm /tmp/oldstamp /tmp/newstamp
Perl使ってもOKでしたら、以下のようなワンライナーはいかがでしょう。
Date::Parseが必要です。
また、すごく長いです…。
その分、演算子にイコールをつけるかどうかで指定日時を含むかどうかを柔軟に設定できます。
perl -MFile::Find -MDate::Parse -MDate::Format -e 'find(sub {$t = (stat($_))[9]; printf(qq([%s] %s\n), time2str("%Y/%m/%d %T", $t), $File::Find::name) if ((-f $_) && $t > str2time($ARGV[0]) && $t < str2time($ARGV[1]));}, ".");' '2008/03/12 00:00:00' '2008/03/12 18:00:00'
Linux環境が手元になかったのでもしかしたらクォートが間違っているかもしれません。
実際にはWindows環境で以下のPerlワインライナーを試しました。
perl -MFile::Find -MDate::Parse -MDate::Format -e "find(sub {$t = (stat($_))[9]; printf(qq([%s] %s\n), time2str('%Y/%m/%d %T', $t), $File::Find::name) if ((-f $_) && $t > str2time($ARGV[0]) && $t < str2time($ARGV[1]));}, '.');" "2008/03/12 00:00:00" "2008/03/12 18:00:00"
出力は以下のようになります。
[2008/03/12 14:20:48] ./a.txt [2008/03/12 14:18:42] ./b/bb.txt
また、OSコマンドにこだわりたい場合、以下のシェルスクリプトが参考になると思います。
(私が以前同じようなことをした際のメモ代わりのスクリプトです。)
[参考URL]
分単位の指定でよければちょっと長いですがこんなのはいかがでしょうか。
ただし未来の指定はできません。
CUR=`date +%s` && find . -mmin -$((($CUR - `date -d '2008/03/01 00:05' +'%s'`)/60)) -and -mmin +$((($CUR - `date -d '2008/03/20 06:38' +%s`)/60))
コメント(0件)