- ベストアンサー
最新の更新日時を取得したい
RedHatLinux7.0です。シェル(bash)からサブディレクトリを含め最新の更新ファイルのファイル名とパスとその日時を得たいのですがその方法がわかりません。たとえば、、 ls -Rlt /home/dareka/public_html とするとサブディレクトリ毎に新しい順に並べてくれるのですが、欲しいのはこれらのファイルのうち最新のファイル名を一つだけとその日時とパスを知りたいのです。このような結果を得るコマンドはありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
基本的なUNIXコマンドだけだと、ちょっと思い付かなかったので、直接更新時刻を得るプログラムをCで書いてみました。 #include <stdio.h> #include <string.h> #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> char FPath[ MAXPATHLEN + 1 ]; struct stat FileInfo; int main (int argc, const char * argv[]) { while ( fgets( FPath, sizeof FPath, stdin ) ){ FPath[ sizeof FPath - 1 ] = '\n'; *strchr( FPath, '\n' ) = '\0'; if ( lstat( FPath, &FileInfo ) ){ continue; } printf( "%10d %s\n", FileInfo.st_mtime, FPath ); } } これをビルドしたものを、a.outとすると、こんな感じで使えます: [localhost:~/test] osamuy% find . -type f | a.out | sort -r 1044149908 ./a.out 1044149906 ./main.c 1044145197 ./test.pbproj/project.pbxproj (以下略) FreeBSDとMac OS Xで試してますが、標準的な関数しか使ってないので、Linuxでも使えると思います。 Perlが使えるならfind2perlが入っているはずですので、そちらを使えば、てっとりばやく実現できます。 [localhost:~/test] osamuy% find2perl . -type f -eval 'printf "%10d %s\n", (lstat(_))[9], $name' | perl | sort -r 1044149908 ./a.out 1044149906 ./main.c 1044145197 ./test.pbproj/project.pbxproj っていうか、こっちを試してから、Cで書いてみたという。 find2perlについては、manpageをご覧下さい。 time_tが時刻書式じゃないとイヤな場合は、localtimeやstrftimeのmanpageをご覧下さい。
その他の回答 (3)
- xjd
- ベストアンサー率63% (1021/1612)
>ls -Rlt /home/dareka/public_html 一日たって思いついたのですが、ホームページコンテンツの 不正改竄チェック等を考えておられるのでしょうか? うちのサーバではtripwireをcronで毎日走らせて、改竄チェック をしています。 ホームページコンテンツのあるディレクトリを指定して、 日付が変わったファイル サイズが変わったファイル 新しく追加されたファイル 削除されたファイル などがあれば報告してくれます。 ご参考まで。
お礼
回答ありがとうごさいます。お礼が遅くなって申し訳ありません。 サーバを複数のユーザに利用していただいているのですが、目的はそのユーザがデータを更新しているかどうかをチェックするためです。知りたいのは変更があったことではなく、変更されなくなってからどれくらい経過したかです。
- xjd
- ベストアンサー率63% (1021/1612)
(補足) 最新のファイル名、という条件が必要なら、日付でソートされたファイル一覧の1行目だけをheadコマンドで 取り出せます。
お礼
-Rオプションが付くと、サブディレクトリをまたがって-tオプションのソートが有効にならないようです。したがってサブディレクトリを含めpublic_html以下すべてのファイルの中で最新のファイルを一個だけ取得できません。 シェルからは無理なんでしょうか?
- xjd
- ベストアンサー率63% (1021/1612)
findコマンドを利用してみてはどうでしょう。 man findで使い方を調べてみてください。 find /home/dareka/public_html -mtime 1 -exec ls -la {} \;
お礼
回答ありがとうございます。 -mtime 1 これは最後に更新して1日以内のファイルを探すということかと思いますが、これでは2日以上前に更新されたファイルが最新の場合は見つけられません。
お礼
回答ありがとうございます。お礼が遅くなって申し訳ありません。 以下のようにしていまくいきました。 find2perl /home/dareka/public_html -type f -eval 'printf "%10d,%s\n", (lstat(_))[9], $name'|perl|sort -r|head -1 このあと秒数を変換して目的の通りになりました。ありがとうございました。