• ベストアンサー

最新の更新日時を取得したい

RedHatLinux7.0です。シェル(bash)からサブディレクトリを含め最新の更新ファイルのファイル名とパスとその日時を得たいのですがその方法がわかりません。たとえば、、 ls -Rlt /home/dareka/public_html とするとサブディレクトリ毎に新しい順に並べてくれるのですが、欲しいのはこれらのファイルのうち最新のファイル名を一つだけとその日時とパスを知りたいのです。このような結果を得るコマンドはありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

基本的な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をご覧下さい。

hellobell
質問者

お礼

回答ありがとうございます。お礼が遅くなって申し訳ありません。 以下のようにしていまくいきました。 find2perl /home/dareka/public_html -type f -eval 'printf "%10d,%s\n", (lstat(_))[9], $name'|perl|sort -r|head -1 このあと秒数を変換して目的の通りになりました。ありがとうございました。

その他の回答 (3)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.4

>ls -Rlt /home/dareka/public_html 一日たって思いついたのですが、ホームページコンテンツの 不正改竄チェック等を考えておられるのでしょうか? うちのサーバではtripwireをcronで毎日走らせて、改竄チェック をしています。 ホームページコンテンツのあるディレクトリを指定して、 日付が変わったファイル サイズが変わったファイル 新しく追加されたファイル 削除されたファイル などがあれば報告してくれます。 ご参考まで。

参考URL:
http://www.zdnet.co.jp/enterprise/0209/11/n13.html
hellobell
質問者

お礼

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

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.2

(補足) 最新のファイル名、という条件が必要なら、日付でソートされたファイル一覧の1行目だけをheadコマンドで 取り出せます。

hellobell
質問者

お礼

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

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.1

findコマンドを利用してみてはどうでしょう。 man findで使い方を調べてみてください。 find /home/dareka/public_html -mtime 1 -exec ls -la {} \;

hellobell
質問者

お礼

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

関連するQ&A

  • 環境変数について

    OSはRedHatLinux9、シェルはbashを使っているのですが、環境変数(パスの設定)はどこのファイルに書くのが一般的なのでしょうか? それぞれのユーザのホームディレクトリでls -aとしたら、.bash_profile、.bashrcがあり、/etcにはprofileがあります。 最近は、.bash_profileにパスを設定するのですが、あまり他のファイルに書くのと何が違うのかわからずに書き込んでいます。できれば、その違いまで教えていただければ幸いです。よろしくいお願いします。

  • 更新日時でソートしてファイル一覧を取得したい

    特定のディレクトリのファイル一覧を取得したいのですが、必要なのは最終更新日時でソートし、最新の30件のファイル名です。(ディレクトリのファイル件数は30件以上とは限りません) exec()を使った外部コマンドでは最新の1件のファイル名は取得できたのですが、30件となると方法がわかりません。 今考え付くのは、 dir()コマンドで取得したファイル名から最終更新日時を取得し、ソートして30件取り出す という方法です。 他にもっとスマートな方法で最新30件のファイル名を取得する方法はないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • Unix Shell 最新更新日時のファイルパス

    例えば以下のディレクトリに次のようなデータがあるとします。 /home/work/test ・INV_20110401000001.csv ・INV_20110401000002.csv ・INV_20110401000003.csv これらのファイルの中から最新の更新日時のファイルのパスを取得したいのですが、 良い方法が思いつきません。 末尾の数字が大きいものが最新ファイルとは限らず、 ファイルがいくつあるかも日によってかわります。 testコマンドでは比較ファイルを2つまでしか指定できず困っています。 どなたかご存知の方がいれば教えていただきたいです。 よろしくお願いいたします。

  • サブディレクトリも含めて最新のファイルを調べる

    Linux 上のあるディレクトリ配下に存在するすべてのファイルの中で(サブディレクトリ配下も含めて) 更新日時が最新のファイルを抽出したいのですが やり方をご存知であれば教えてください。 ディレクトリが一つだけ or 対象が特定できるなら ls -lrt とかで分かりますが 再帰的にすべてのサブディレクトリを対象としたいのです。 できれば1回のコマンド(ワンライナー)で実行できるとありがたいですが、 それはさすがに大変な気がしますので、 あくまでできればということで。。

  • lsでのファイル名・パスのフルパス取得

    環境:Solaris10 lsコマンドでディレクトリ、ファイル名の一覧を取得しようとしています。 条件としては 1.対象は全てのディレクトリ・ファイル(ls -R) 2.実行結果はアクセス権・所有者の情報も含む(ls -lの結果のような) 3.ディレクトリ・ファイル名ともにフルパスで表示 この上記3点を満たそうとして、 ls -dlR / と実行してみましたが、この場合Rスイッチが有効になりませんでした。 OS標準コマンドでこの3点を満たすことは出来るのでしょうか?

  • 更新日時を表示させたくない

    フォルダの中にあるファイルを古い順に並べていきたいです。 しかし、更新日時(作成日時)順にすると各ファイルの下にグレーの文字で更新日時が表示されてしまいます。 これを表示したくないのです。 名前順で並べ替えたときと同じようにファイル名だけが表示されるようにしたいのですがどうすれば良いでしょうか?

  • コマンドプロントでlsを使えるようにする

    windowsのコマンドプロンプトもlsを使えるように使えるようにしたいのですがうまくできません。 わかる方いらっしゃいましたらどうかよろしくお願いします。 まず、私が行った方法はCドライブの直下に以下のようにbashフォルダを作成しました。(C:\bash) 次にテキストファイルを作成し拡張子を.batにしてbashフォルダ内に作成しました。(ls.bat) 上記バッチファイルの中にコマンド「dir」と書き保存しました。 最後に作成したフォルダにパスを通すために 変数名:Path 変数値:C:\bash を追加しました。 以上の工程でlsが使えるようになると思ったのですが、使えませんでした。 なぜ使えないのかわかる方教えてください。

  • Linuxでディレクトリ内の最新ファイルとファイル数を取得したいです。

    ディレクトリ内にファイルが多すぎて lsしても画面が流れてしまい困っています。 ・ディレクトリのファイル数を取得したい ・ディレクトリ内の最新ファイルの日付を取得したい のですがどうしたら良いでしょうか?

  • perl-cgi「日時によるファイル操作」について

    perl-cgi「日時によるファイル操作」について perl-cgiで、あるディレクトリ中のファイル更新日が最も若い2ファイルを表示して、それ以外を削除したいのですがどのようにすればよいでしょうか? #調べたいディレクトリを読み込む。 $Dir = "./cache"; opendir DIR,"$Dir"; my @alldir = readdir DIR; close DIR; #ファイル(パス)名と作成日時を求める。 #最新2つのファイルパス(名)を表示する。 print "NewFile".ファイルパス1; print "<HR>"; print "OldFile".ファイルパス2; #最新2つ以外は全て削除 unlink($_); exit(0);

    • ベストアンサー
    • Perl
  • あるディレクトリのファイルの名前を「更新日時」にしたいのですが・・

    (1) あるディレクトリの中の全てのファイルについて (2) 例えば 2007/1/2 3:45 に作成したファイル   aaa.dat のファイル名を   2007-01-02-0345-aaa.dat 方法はないでしょうか?perl でも bash でも良いのですが・・ (ちょっと事情があってあせっています・・) よろしくお願いします!

    • ベストアンサー
    • Perl