2011-03-13 71 views
11

我正在努力處理在特定月份修改的列表文件(例如2月)。 這裏有幾次不成功的嘗試:UNIX/BASH:列出在特定月份修改的文件

1)我試圖創建臨時文件,並在接下來的一個月的時間戳記設置爲在第一時間和目標月首次在查找中使用-newer,像這樣:

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

這列出了在時間間隔($ from,$ to)中修改過的文件,但是我想要時間間隔[$ from,$ to)(否則,會在第一秒創建文件時出現誤報在下個月)。在2月份修改的列表文件是額外的問題,因爲這需要將其中一個時間戳設置爲2月份的最大時間戳,但2月的天數取決於它是否爲閏年,這需要額外的檢查。

2)如果我使用ls解析時會看到很多複雜情況,因爲用戶名或組中可能包含空格。

是否有一個簡單的方法和相對便攜的方式來做到這一點(所以它適用於任何月份,無論文件名等)?

+1

你[不應解析'ls'(http://mywiki.wooledge.org/ParsingLs)如你所發現的。 – 2011-03-13 14:11:02

回答

15

dateallows您可以輕鬆地生成時間戳目的這樣的:

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月

修改的所有文件
0

一種解決方法可以是使用-printf選項find

find -printf "%Cm %p\\n"| egrep ^02 |cut -b4- 

我不認爲find可以過濾-printf結果本身,也不能在日期元素進行篩選。

編輯或者,如果你真的想ls樣輸出:

find -printf "%Cm " -ls | egrep ^02 |cut -b4- 
+0

不確定'-printf'是多麼便攜。 Solaris似乎沒有它。 – Mat 2011-03-13 13:04:37

3

好吧,我可以創建具有最小的時間戳和月,最大的時間戳和文件只是文件每個方向超過二月。

$ 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'可移植性如何。

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