Command-Line
如何按設置為日期的文件名刪除文件?
我想刪除文件不是按日期訪問或創建,而是按文件名。文件名將是日期,我希望每週執行一次 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
{} \;