'find'コマンドで変更された日時を表示するにはどうすればよいですか?


85

findコマンドを使用すると、複数のレベルのディレクトリ名を表示できます。次のコマンド/varは、パスの下にあるすべてのディレクトリを深さ2で表示します。

find /var -maxdepth 2 -type d;

結果は次のとおりです。

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

ではstatコマンド、私が変更された日付の時間を見つけることができます。

stat /var/log/samba | grep 'Modify:'

結果は次のとおりです。

Modify: 2014-01-02 11:21:27.762346214 -0800 

2つのコマンドを組み合わせて、ディレクトリが変更された日時で一覧表示されるようにする方法はありますか?

回答:


63

あなたは使用することができます-execのためのスイッチをfindとの出力形式を定義stat使用して-c、次のようにスイッチを:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

これにより、出力の同じ行にファイル名とそれに続く変更時刻が表示されます。


それは私の答えよりも優れています、+ 1
ケント

-printf以下のオプションはstat、見つかったすべてのファイルの呼び出しを回避します。私のテストでは、コマンドはほぼ同じ出力を生成しますが、秒の精度が1桁余分になります。
mwfearnley

MacOSの場合、フォーマット引数文字はstatです-ffind /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar

126

受け入れられた答えは機能しますが、遅いです。ディレクトリごとにstatを実行する必要はありません。findは変更日を提供し、直接印刷するだけです。これは、かなり高速な同等のコマンドです。

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"

4
はるかに優れたソリューション。またfindstatコマンドがないWindowsで実行されているfrommsysでも機能します。
Snorfalorpagus 2014年

7
Macでは、「brew install findutils」、次にgfindに-printfオプションがあります。
WeakPointer 2017年

%Tc「ロケールの日付と時刻」を出力し、フォーマット文字列「%p%Tc」を許可します
Andreas

%フォーマッターの説明のためのより役立つリンク。unix.stackexchange.com/a/215236/216480またはmanページで「-printfformat」を検索
styks 2018年

1
フォーマット文字列 "%p%Tc"は機能しますが、出力のフォーマットは少し異なります。例:「/ var / pool2014-09-29 09:05:54.000000000 + 0100」の代わりに「/ var / spoolMon 29 Sep 2014 09:05:54BST」。
kzar 2018年

15

find /var -maxdepth 2 -type d | xargs ls -oAHd

これは、基本的なlsコマンドで完全なディレクトリパスを表示する方法です。ながらls持つ-R再帰検索のパラメータを、パスが用いた結果に表示されません-lか、-oとのEXのために、オプション(OSXで、少なくとも)ls -lR


これが質問に答える理由の説明を追加してください。一般に、StackOverflowの回答にサンプルコードを投稿するときはいつでも、文化は常にそれについての説明を提供することです。そうしないと、モデレーターがあなたの回答を長さが短く説明が不足しているために質の低い回答として削除するリスクがあります。
sideshowbarker 2015

3
これはあなたが達成できるfind /var -maxdepth 2 -type d -lsもので、もっと簡単です。
Grzegorz Krauze 2017年

13

最近のGNUバージョンにfindは、-printf日付フィールドを含むオプションも含まれています。ファイルの名前と変更時刻を標準の「C」形式で印刷する必要がある場合は、次を使用できます。-printf "%c %p\n"

特定の形式の日付が必要な場合は、%Cその後にフィールド文字を使用できます。例えば、4桁の年は次のようになります%CYと、Y4桁の年のための文字であること。
複数のフィールドが必要な場合は、%C複数回指定する必要があることに注意してください。たとえば、YYYY-MM-DD形式はのようになり%CY-%Cm-%Cdます。

詳細については、マニュアルページまたはオンラインドキュメントを確認してください。

これが実際の例です:

find . -name favicon.ico -printf "%c %p\n"

8

昨日に変更されたファイルを印刷するために使用するもう1つ。ls -ltrは、変更時間、ユーザーなどの詳細を教えてくれます

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 

1
これは最も単純で、覚えやすく、入力が最も簡単です。(私は-mtimeおよび-type引数なしで使用し、代わりに-name '*.ext'仕様を使用します。ls -lt変更時刻でソートします。)
Brent Faust

2
ファイル名にスペースが含まれている場合、これは機能しません。ベターは、使用すること-print0の代わりに-print、次に使用xargs -0するのではなくxargs
emk22 0319年

xargslsパラメータの数に応じて、コマンド(ここ)を数回呼び出すことがあります。これにより、コマンドが過剰な数のパラメータで呼び出されるのを防ぐことができます。したがって、並べ替え(日付を含む基準が何であれ)は、「間違った」結果をもたらす可能性があります(=>完全なセットの並べ替えではなく、並べ替えられたサブセットのリスト)。
syme7

1

この行を試してください:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

ここで実行すると、次のように出力されます。

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.