Command-Line

如何按設置為日期的文件名刪除文件?

  • July 9, 2016

我想刪除文件不是按日期訪問或創建,而是按文件名。文件名將是日期,我希望每週執行一次 cronjob,以清除超過 7 天的文件名日期。我可以做一個

find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete

但是我必須每週更改一次腳本才能執行。我想避免每週都修改工作。

這是一種更健壯的形式,可以正確處理文件名和目錄名中的空格(甚至換行符)。

find . -type f -name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz' -exec sh -c 'fdate="${1%.qz}"; fdate="${fdate##*.}"; [ "$fdate" "<" "$(date +%F -d "7 days ago")" ] && rm "$1"' find-sh {} \;

這涉及到很多對某些人來說可能看起來很陌生的 shell 技巧,所以讓我們分解一下:

從目前目錄開始,遞歸查找所有正常文件…

find . -type f

…其名稱以確切的模式“.YYYY-MM-DD.qz”結尾…

-name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz'

…然後,在每個匹配的文件上執行一個 shell 命令(注意單引號)…

-exec sh -c '

…首先剝離尾隨的“.qz”…

fdate="${1%.qz}";

…然後剝離前導的額外部分,只留下“YYYY-MM-DD”…

fdate="${fdate##*.}";

…並比較該字元串以查看它的排序(按詞法)是否早於 7 天前的日期的“YYYY-MM-DD”…

[ "$fdate" "<" "$(date +%F -d "7 days ago")" ]

…如果是這樣,刪除文件…

&& rm "$1"'

…我們將使用“find-sh”作為“腳本名稱”(即$0)用於錯誤報告…

find-sh

…並將找到的文件名設置為內聯 shell 腳本的find參數一 ( )。$1

{} \;

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