2011-06-30 26 views
28

我知道有這個選項用於UNIX的find命令:UNIX find:與-newer選項相反嗎?

find -version 
GNU find version 4.1 

    -newer file Compares the modification date of the found file with that of 
     the file given. This matches if someone has modified the found 
     file more recently than file. 

有沒有可以讓我發現,是年長超過一定的文件文件的選項。我想刪除目錄中的所有文件進行清理。所以,我會找到比N天更早的所有文件的替代方案也可以完成這項工作。

回答

32

可以使用!否定這樣的-newer操作:

find . \! -newer filename 

如果你想找到上次修改多於4天前使用的文件:

find . -mtime +7 

UPDATE:

爲了避免對你是比較反對使用以下文件匹配:

find . \! -newer filename \! -samefile filename 
+1

重要的是要注意,這個邏輯將是「等於或大於」。所以,如果它在路徑中,它將包含參考文件。請參閱下面烈士的答案以獲得更好的解決方案。 – swdev

+0

Marty的回答也會阻止與測試文件同名的文件的匹配。我更新了測試的答案,排除了正在測試的文件。 – qbert220

6

你可以用否定:

find ... \! -newer <reference> 

您也可以嘗試-mtime/-atime/-ctime/-Btime家庭的選擇。我不會立即記得它們是如何工作的,但在這種情況下它們可能會有用。

當心從find操作刪除文件,特別是一個運行的根;有很多方法在同一系統上的非特權,惡意程序可以欺騙成刪除你不想刪除的東西一大堆。我強烈建議你閱讀GNU find manual的整個「Deleting Files」一節。

2

請注意,較新的手段「舊的或相同的時間戳」的否定:

當你看到在這個例子,也返回同一個文件:

[email protected]:/home/thomas/tmp/ touch test 
[email protected]:/home/thomas/tmp/ find ./ ! -newer test 
./test 
4

如果你只需要文件是不是文件「foo」的舊的而不是foo本身,使用否定排除名的文件:

find . ! -newer foo ! -name foo 
1

不幸的是,找到犯規支持這一 ! - 更新不代表更舊。它只意味着不是更新,但它也匹配具有相同修改時間的文件。所以我寧願使用

for f in path/files/etc/*; do 
    [ $f -ot reference_file ] && { 
     echo "$f is older" 
     # do something 
    } 
done