我正在努力处理在特定月份(例如,2月)修改的列表文件。 以下是几次不成功的尝试:
1)我尝试创建临时文件并在下个月第一次设置时间戳,并在目标月份中第一次设置,并在find中使用-newer,如下所示:
find -newer "$from" ! -newer "$to"
这列出了在时间间隔($ from,$ to)中修改的文件,但我希望时间间隔[$ from,$ to)(否则,在第一秒创建的文件中会出现误报下个月)。 2月修改的列表文件是额外的问题,因为这需要将其中一个时间戳设置为仍然在2月份的最大时间戳,但是2月份的天数取决于它是否是闰年,这需要额外的检查
2)如果我使用ls
,我在解析时会看到很多复杂因素,因为用户名或组可能包含空格。
是否有一种简单的方法和相对便携的方式(所以它适用于任何月份,无论文件名等)?
答案 0 :(得分:18)
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月修改的所有文件
答案 1 :(得分: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
我不知道这些论据对其他版本的'find'是多么可移植。
答案 2 :(得分:1)
添加到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
答案 3 :(得分:0)
解决方法可能是使用-printf
选项find
:
find -printf "%Cm %p\\n"| egrep ^02 |cut -b4-
我认为find
不能过滤-printf
结果本身,也不能过滤日期元素。
编辑或者如果您真的想要ls
- 输出:
find -printf "%Cm " -ls | egrep ^02 |cut -b4-