web-dev-qa-db-ja.com

Linuxターミナルで、フォルダの内容を考慮して、フォルダの最終変更日を表示するにはどうすればよいですか?

だからここに契約があります。 「web」という名前のディレクトリがあるとします。

$ ls -la

drwx------  4 rimmer rimmer 4096 2010-11-18 06:02 web

しかし、このディレクトリ内、web/php /

$ ls -la

-rw-r--r-- 1 rimmer rimmer 1957 2011-01-05 08:44 index.php

つまり、私のディレクトリ/web/php/index.phpのコンテンツは2011-01-05に最後に変更されましたが、/ web /ディレクトリ自体は2010-11-18に最後に変更されたと報告されます。

私がする必要があるのは、/ web /ディレクトリの最終変更日を、このディレクトリ内のファイル/ディレクトリの最新の変更日として再帰的に報告することです。

これを行うにはどうすればよいですか?

58

何かのようなもの:

find /path/ -type f -exec stat \{} --printf="%y\n" \; | 
     sort -n -r | 
     head -n 1

説明:

  • findコマンドは、ディレクトリを再帰的に無視してすべてのファイルの変更時間を出力します(IQAndreasによるコメントによれば、フォルダのタイムスタンプに依存することはできません)
  • sort -n(数値)-r(逆)
  • head -n 1:最初のエントリを取得
50
Paulo Scardine

_-printf_をサポートするfindのバージョン(GNU findなど)がある場合、statを繰り返し呼び出す必要はありません。

_find /some/dir -printf "%T+\n" | sort -nr | head -n 1
_

または

_find /some/dir -printf "%TY-%Tm-%Td %TT\n" | sort -nr | head -n 1
_

ただし、再帰が必要ない場合:

_stat --printf="%y\n" *
_
19

できれば、パウロの答えに投票します。私はそれをテストし、概念を理解しました。動作することを確認できます。 findコマンドは多くのパラメーターを出力できます。たとえば、--printf句に次を追加します。

%a for attributes in the octal format
%n for the file name including a complete path

例:

find Desktop/ -exec stat \{} --printf="%y %n\n" \; | sort -n -r | head -1
2011-02-14 22:57:39.000000000 +0100 Desktop/new file

この質問も挙げてみましょう。この質問の著者は、BashまたはPHPを使用して問題を解決したいですか?指定する必要があります。

6
Martian