我正在努力处理在特定月份修改的列表文件(例如2月份)。 这里有几个不成功的尝试:
1)我试着创build临时文件,并在下个月第一次设置时间戳,并在目标月份中首次使用-newer查找,如下所示:
find -newer "$from" ! -newer "$to"
这列出了在时间间隔($ from,$ to)中修改的文件,但是我想要时间间隔[$ from,$ to)(否则,下个月第一秒创build的文件会出现误报) 。 在2月份修改的列表文件是额外的问题,因为这需要将其中一个时间戳设置为2月份最大的时间戳,但是2月的天数取决于是否是闰年,这需要额外的检查。
2)如果我使用ls
,在parsing时会看到很多复杂的情况,因为用户名或组包含空白的可能性。
有没有一个简单的方法和相对便携的方式来做到这一点(所以它适用于任何月份,无论文件名称等)?
date
允许您轻松地生成时间戳用于这样的目的:
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月份以上的文件。
$ 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'似乎只显示时间戳在二月份的文件。
$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print ./from ./to
我不知道这些参数对于其他版本的“查找”是否可移植。
添加到Pumbaa80的答案:
在我的预生产环境中,查找不支持-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
解决方法是使用-printf
选项来find
:
find -printf "%Cm %p\\n"| egrep ^02 |cut -b4-
我不认为find
可以过滤-printf
结果本身,也不能过滤日期元素。
编辑或者如果你真的想要ls
的输出:
find -printf "%Cm " -ls | egrep ^02 |cut -b4-