UNIX / BASH:列出在特定月份修改的文件

时间:2011-03-13 12:46:08

标签: bash list file unix timestamp

我正在努力处理在特定月份(例如,2月)修改的列表文件。 以下是几次不成功的尝试:

1)我尝试创建临时文件并在下个月第一次设置时间戳,并在目标月份中第一次设置,并在find中使用-newer,如下所示:

find -newer "$from" ! -newer "$to"

这列出了在时间间隔($ from,$ to)中修改的文件,但我希望时间间隔[$ from,$ to)(否则,在第一秒创建的文件中会出现误报下个月)。 2月修改的列表文件是额外的问题,因为这需要将其中一个时间戳设置为仍然在2月份的最大时间戳,但是2月份的天数取决于它是否是闰年,这需要额外的检查

2)如果我使用ls,我在解析时会看到很多复杂因素,因为用户名或组可能包含空格。

是否有一种简单的方法和相对便携的方式(所以它适用于任何月份,无论文件名等)?

4 个答案:

答案 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。

我所做的是:

  1. 获取所有可能文件的列表(通过findls等。)
  2. 生成上个月和本月最后一秒的时间戳

    LAST_MONTH=$(date -d "01-Jun-2015" -1 sec +%s)
    THIS_MONTH=$(date -d "31-Jul-2015" +%s)
    
  3. 从第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-