Linux按日期在主路徑查找和刪除文件
我在我的主目錄中執行了一些生成大量輸出文件(日誌、錯誤、警告等)的程序。要查找在特定日期(例如 2021 年 9 月 17 日)生成的輸出文件,我嘗試了以下命令:
find . -type f -newermt 2021-09-17
它應該找到所有在 2021 年 9 月 17 日被修改的文件,如此處所述,並且它確實有效。但是,該命令不僅返回輸出文件,還返回我的主目錄中的一些隱藏文件,例如
.history
,.viminfo
和.cache
.現在,如果我嘗試刪除我找到的所有文件
find . -type f -newermt 2021-09-17 | xargs rm -f
隱藏文件也會被災難性地刪除嗎?如果答案是肯定的,我應該如何更改它以便保留隱藏文件並且只刪除輸出文件?
find . -type f -newermt 2021-09-17
在目前目錄或任何級別的子目錄中(但不遵循符號連結),每行列印一個,其最後修改時間比本地ime 的正常(f
類型)文件。這包括當天最後修改的文件,也包括以後修改的文件(包括將來修改時間的文件)。m``newer``2021-09-17T00:00:00.000000000``t
該輸出不能可靠地進行後處理¹。如果您想刪除這些文件,您可以使用
-exec rm -f {} +
infind
,或者-delete
由一些find
實現支持,其中大多數都支持-newermt
。但無論如何,是的,它會刪除它能夠刪除的任何文件,包括配置文件、您的文件、圖片等,包括隱藏文件或隱藏目錄中的文件。
如果您想排除隱藏文件(包括隱藏目錄中的文件,例如
~/.config
),並且只刪除當天(而不是以後)最後修改的文件,您需要:LC_ALL=C find . -name '.?*' -prune -o \ -type f -newermt 2021-09-17 ! -newermt 2021-09-18 -exec rm -f {} +
您不能
-delete
在那裡使用,因為-delete
(這意味著-depth
)與-prune
.但即便如此,我也不會在你的主目錄上盲目地執行它。
如果您只想刪除目前目錄中的文件而不是子目錄中的文件,您可以這樣做:
LC_ALL=C find . -maxdepth 1 ! -name '.*' \ -newermt 2021-09-17 ! -newermt 2021-09-18 -type f -delete
如果使用
zsh
外殼,您還可以執行以下操作:autoload age rm -f -- *(.e['age 2021-09-17'])
預設情況下,zsh glob 會跳過隱藏文件,而
find
.或遞歸(仍然跳過隱藏文件和目錄):
rm -f -- **/*(.e['age 2021-09-17'])
¹ 因為文件是換行符分隔的,並且換行符與文件名中的任何字元一樣有效。更多關於為什麼循環查找的輸出不好的做法?