UNIX / BASH:列出特定月份修改的文件
Posted
技术标签:
【中文标题】UNIX / BASH:列出特定月份修改的文件【英文标题】:UNIX / BASH: Listing files modified in specific month 【发布时间】:2011-07-14 10:47:30 【问题描述】:我正在努力列出特定月份(例如 2 月)修改过的文件。 以下是几次不成功的尝试:
1) 我尝试创建临时文件并将它们的时间戳设置为下个月的第一次和目标月份的第一次,并在查找中使用 -newer,如下所示:
find -newer "$from" ! -newer "$to"
这列出了在时间间隔 ($from, $to] 内修改的文件,但我想要时间间隔 [$from, $to) (否则,在第一秒创建的文件会出现误报)下个月)。列出在 2 月份修改的文件是额外的问题,因为这需要将时间戳之一设置为仍然在 2 月份的最大时间戳,但 2 月份的天数取决于是否是闰年,这需要额外检查.
2) 如果我使用ls
,我会在解析时看到很多复杂性,因为用户名或组可能包含空格。
是否有一种简单且相对便携的方法来执行此操作(因此它适用于任何月份,无论文件名等如何)?
【问题讨论】:
你shouldn't parsels
,正如你所发现的那样。
【参考方案1】:
date
allows 你可以轻松地为这样的目的生成时间戳:
date -d "01-Mar-2011 -1 sec" # last second of Feb-2011
幸运的是,find
中可以使用相同的语法:
month="Mar-2010"
find . -newermt "01-$month -1 sec" -and -not -newermt "01-$month +1 month -1 sec"
将查找在 2010 年 3 月修改的所有文件
【讨论】:
【参考方案2】:好吧,我可以创建在 2 月具有最小时间戳和最大时间戳的文件,和在每个方向上刚好超过 2 月的文件。
$ touch -t 201102010000.01 from
$ touch -t 201102282359.59 to
$ touch -t 201103010000.01 march
$ touch -t 201101312359.59 january
$ ls -l
total 0
-rw-r--r-- 1 mike None 0 Feb 1 00:00 from
-rw-r--r-- 1 mike None 0 Jan 31 23:59 january
-rw-r--r-- 1 mike None 0 Mar 1 00:00 march
-rw-r--r-- 1 mike None 0 Feb 28 23:59 to
然后像这样使用 GNU 'find' 似乎只显示时间戳在 2 月的文件。
$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print
./from
./to
我不知道这些参数对于其他版本的 'find' 的可移植性。
【讨论】:
【参考方案3】:添加到 Pumbaa80 的答案:
在我的预生产环境中,find 不支持-newermt。
我所做的是:
-
获取所有可能文件的列表(通过
find
、ls
等)
生成上个月最后一秒和本月的时间戳
LAST_MONTH=$(date -d "01-Jun-2015" -1 sec +%s)
THIS_MONTH=$(date -d "31-Jul-2015" +%s)
从第 1 点开始遍历列表,并将每个文件的时间戳与第 2 点的时间戳进行比较
for file in $LIST_OF_FILES
do
TIMESTAMP=$(stat -c"%Y" $file)
if (( $LAST_MONTH < $TIMESTAMP ))
then
if (( $TIMESTAMP < $THIS_MONTH ))
then
echo "Your code here"
fi
fi
done
【讨论】:
【参考方案4】:一种解决方法是使用-printf
选项到find
:
find -printf "%Cm %p\\n"| egrep ^02 |cut -b4-
我认为find
不能过滤-printf
结果本身,也不能过滤日期元素。
编辑,或者如果你真的想要ls
-like 输出:
find -printf "%Cm " -ls | egrep ^02 |cut -b4-
【讨论】:
不确定-printf
的便携性如何。 Solaris 似乎没有。以上是关于UNIX / BASH:列出特定月份修改的文件的主要内容,如果未能解决你的问题,请参考以下文章