Linux

Linux按日期在主路徑查找和刪除文件

  • September 21, 2021

我在我的主目錄中執行了一些生成大量輸出文件(日誌、錯誤、警告等)的程序。要查找在特定日期(例如 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 {} +in find,或者-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'])

¹ 因為文件是換行符分隔的,並且換行符與文件名中的任何字元一樣有效。更多關於為什麼循環查找的輸出不好的做法?

引用自:https://unix.stackexchange.com/questions/669844