我想获取 2016 年创建的目录及其子目录(递归地)中的文件数量。我只关心具有特定文件结尾的文件,例如“.txt”。我怎样才能在终端中实现这一目标?
答案1
使用 GNU find
:
find /some/dir -type f -name '*.txt' -printf '%CY\n' | grep -Fxc 2016
ctime
这将计算本地时区中带有 2016 年的文件。请注意,这ctime
不是文件的创建时间,而是您可以使用标准 UNIX 语义期望的最佳近似时间。
如果你想匹配修改时间,你可以使用-printf '%TY\n'
上面而不是-printf '%CY\n'
。
答案2
这是一种便携式方式,不需要GNUfind
.
首先创建带有时间戳的文件
touch -t 201601010000 /tmp/2016 && touch -t 201701010000 /tmp/2017
然后执行。
find /some/path -type f -name '*.txt' -newer /tmp/2016 ! -newer /tmp/2017
答案3
具有 GNU find
和 on 系统和文件系统支持文件出生时间:
find . -name '*.txt' -type f -newerBt 2016-01-01 \
! -newerBt 2017-01-01 -printf . | wc -c
从技术上讲,这将排除在 2016-01-01 00:00:00.000000000 纳秒创建的文件,并包括 2017 年在该纳秒创建的文件(我不希望你的时钟有那么精确,或者无论如何它都很重要,但它可以例如,对于 cron 作业在 00:00:00 创建的文件,不支持亚秒时间戳的文件系统很重要)
如果您的系统不支持出生时间,您可以恢复到上次修改时间(无论如何这可能更好,因为出生时间是文件实例化的时间(不一定是该名称),而不是其中数据的时间这样写在实践中几乎没有什么意义),通过更改newerBt
为newermt
.
使用 BSD find
(它们的-newerxy
来源),您可以将其更改为:
find .//. -name '*.txt' -type f -newerBt 2016-01-01 \
! -newerBt 2017-01-01 | grep -c //