Linux上で、あるディレクトリ以下のファイルから

指定した更新日付の範囲内であるものを検索する方法を教えてください。
できればワンライナだとうれしいです。

「XX日前」とかではなくて、「2008/03/01 00:00:00から2008/03/10 00:00:00まで」
のような指定をしたいというのがポイントです。

findコマンドの-newerコマンドと、touch -t でなんとかしようと試みたのですが、
思いつかなかったので、質問させていただきました。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/03/19 09:47:25
  • 終了:2008/03/26 09:50:02

回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/03/19 11:40:35

ポイント23pt

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'

id:JULY No.2

JULY回答回数966ベストアンサー獲得回数2472008/03/19 13:11:15

ポイント23pt

touch と find というアイデアでいけると思います。

touch -t 古い方の日時 /tmp/oldstamp

touch -t 新しい方の日時 /tmp/newstamp

find . -newer /tmp/oldstamp -a \! -newer /tmp/newstamp -print

rm /tmp/oldstamp /tmp/newstamp

id:bonlife No.3

回答回数421ベストアンサー獲得回数752008/03/19 14:02:14

ポイント22pt

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]

id:litt No.4

litt回答回数9ベストアンサー獲得回数12008/03/20 06:24:47

ポイント22pt

分単位の指定でよければちょっと長いですがこんなのはいかがでしょうか。

ただし未来の指定はできません。

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))

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません