激凹みから立ち直る方法

RedHatLinux7.0です。シェル(bash)からサブディレクトリを含め最新の更新ファイルのファイル名とパスとその日時を得たいのですがその方法がわかりません。たとえば、、

ls -Rlt /home/dareka/public_html

とするとサブディレクトリ毎に新しい順に並べてくれるのですが、欲しいのはこれらのファイルのうち最新のファイル名を一つだけとその日時とパスを知りたいのです。このような結果を得るコマンドはありますか?

A 回答 (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をご覧下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。お礼が遅くなって申し訳ありません。

以下のようにしていまくいきました。
find2perl /home/dareka/public_html -type f -eval 'printf "%10d,%s\n", (lstat(_))[9], $name'|perl|sort -r|head -1

このあと秒数を変換して目的の通りになりました。ありがとうございました。

お礼日時:2003/02/05 22:54

>ls -Rlt /home/dareka/public_html



一日たって思いついたのですが、ホームページコンテンツの
不正改竄チェック等を考えておられるのでしょうか?

うちのサーバではtripwireをcronで毎日走らせて、改竄チェック
をしています。

ホームページコンテンツのあるディレクトリを指定して、

日付が変わったファイル
サイズが変わったファイル
新しく追加されたファイル
削除されたファイル

などがあれば報告してくれます。

ご参考まで。

参考URL:http://www.zdnet.co.jp/enterprise/0209/11/n13.html
    • good
    • 0
この回答へのお礼

回答ありがとうごさいます。お礼が遅くなって申し訳ありません。

サーバを複数のユーザに利用していただいているのですが、目的はそのユーザがデータを更新しているかどうかをチェックするためです。知りたいのは変更があったことではなく、変更されなくなってからどれくらい経過したかです。

お礼日時:2003/02/05 23:15

(補足)


最新のファイル名、という条件が必要なら、日付でソートされたファイル一覧の1行目だけをheadコマンドで
取り出せます。
    • good
    • 0
この回答へのお礼

-Rオプションが付くと、サブディレクトリをまたがって-tオプションのソートが有効にならないようです。したがってサブディレクトリを含めpublic_html以下すべてのファイルの中で最新のファイルを一個だけ取得できません。

シェルからは無理なんでしょうか?

お礼日時:2003/02/01 20:19

findコマンドを利用してみてはどうでしょう。


man findで使い方を調べてみてください。

find /home/dareka/public_html -mtime 1 -exec ls -la {} \;
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

-mtime 1
これは最後に更新して1日以内のファイルを探すということかと思いますが、これでは2日以上前に更新されたファイルが最新の場合は見つけられません。

お礼日時:2003/02/01 20:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!