如何使用“find”命令显示修改日期时间?

114

使用 find 命令,我可以显示多层级文件夹的名称。以下命令将显示深度为2的 /var 目录下的所有文件夹:

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 

有没有一种方法可以将这两个命令结合起来,以便列出带有修改日期时间的目录?

6个回答

181

接受的答案有效但速度较慢。每个目录都不需要为exec stat,find提供了修改日期,您可以直接打印出来。这是一个等效的命令,速度要快得多:

接受的答案虽然可行,但速度较慢。没有必要为每个目录执行stat命令,find提供了修改日期,您可以直接将其打印出来。以下是一条等效的命令,速度要快得多:

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

5
一种更好的解决方案。它也可以在 Windows 上运行的 msys 的 find 命令中使用,因为该命令缺少 stat 命令。 - Snorfalorpagus
10
在Mac上,可以使用命令'brew install findutils'安装findutils,然后使用gfind命令并加上-printf选项。 - WeakPointer
2
%Tc打印“本地日期和时间”,并允许使用格式字符串“%p %Tc”。 - Andreas
1
更多有关%格式化符的解释,请参考以下链接:https://unix.stackexchange.com/a/215236/216480 或在man页面中搜索“-printf format”。 - styks
1
虽然格式字符串“%p%Tc”可以工作,但它会稍微不同地格式化输出。例如,“/ var / spool Mon 29 Sep 2014 09:05:54 BST”而不是“/ var / spool 2014-09-29 09:05:54.000000000 +0100”。 - kzar
显示剩余3条评论

79
您可以使用-exec开关来执行find命令,并使用-c开关定义stat的输出格式,如下所示:find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \; 这将在同一行输出文件名及其修改时间。

1
比我的答案好,+1 - Kent
下面的“-printf”选项避免了为找到的每个文件调用“stat”。在我的测试中,该命令产生几乎相同的输出,只是秒数多了一个额外的数字精度。 - mwfearnley
5
对于 MacOS 的 stat 命令,格式参数字符为 -f。 使用以下命令可以在 /var 目录下查找最大深度为 2 的所有子目录,并对每个子目录运行 stat 命令以显示修改时间和文件名:find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \; - toddcscar

24

最近的GNU版本find还包括一个-printf选项,其中包含日期字段。 如果您需要以标准的“C”格式打印文件名和修改时间,则可以使用-printf“%c %p\n”

如果您想要特定格式的日期,则可以使用%C后跟一个字段字符。例如,4位数的年份将是%CY,其中Y是4位数年份的字符。
请注意,如果需要多个字段,则需要多次指定%C。例如,YYYY-MM-DD格式将看起来像%CY-%Cm-%Cd

有关详细信息,请查看手册或在线文档

这里是一个工作示例:

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

%c 是最后的“更改”时间,所以您可能需要使用 %t 来表示最后一次的“修改”时间(mtime)。这是文件元数据中的两个不同时间戳 - 更改时间与inode(权限、所有权、文件名等)的更改有关,而 mtime 与文件内容的更改有关。 - davidA

19

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

这是一种获取基本 ls 命令以显示完整目录路径的方式。虽然ls有递归搜索的-R参数,但是使用-l-o选项(至少在OSX中)不会在结果中显示路径,例如:ls -lR


请为回答提供解释。通常情况下,如果您在StackOverflow上的回答中发布示例代码,则文化是始终为其提供解释。否则,由于长度短且缺乏解释,您的答案可能会被管理员删除为低质量答案。 - sideshowbarker
4
你可以使用 find /var -maxdepth 2 -type d -ls 命令来实现此目的,这样更简单易懂。 - Grzegorz Krauze

9

这是我用来打印最近一天修改过的文件的命令。 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 - emk2203
xargs 可能会根据参数数量多次调用命令(此处为 ls),以防止使用过多的参数调用该命令。因此,排序(无论标准是什么,包括按日期排序)可能会给出一个“错误”的结果(=> 排序子集列表,而不是完整集合的排序)。 - syme

3

尝试这行代码:

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
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接