TIPS-在 Windows 批次刪除 N 天前的檔案
7 |
工作上常遇到的需求:Log、暫存檔案多半有保留年限,如何用一個指令刪除某個期限前的舊檔?
今天才學到一個好用的 DOS 指令-forfiles,參數不多,簡單易用:
- /p 路徑名稱
查詢對象,省略時為現在所處資料夾 - /m 檔名限制
可配合萬用字元限定檔名或副檔名,例如:*.log、ex1610*.log - /s
指定搜尋範圍包含子目錄及其下層目錄 - /c "對找到檔案執行的動作"
例如:"cmd /c del @path"為刪除檔案,省略參數時預設為"cmd /c echo @file",將顯示找到的檔案名稱 - /d 數字或日期
限定檔案上次修改日期範圍,+代表大於等於,-代表小於等於,可以指定日期,例如:/d +2016/10/01(10/1當天及之後異動的檔案)、/d -2016/10/10(10/10當天與之前修改過的檔案);或指定數字今天起算幾天前的檔案,例如:/d -3(三天前)/d +0(今天)
撰寫 /c 參數時,有以下變數可用:
- @file 檔名
- @fname 檔名去掉副檔名
- @ext 副檔名
- @path 完整路徑
- @relpath 與 /p 為基準的相對路徑
- @isdir 是否為資料夾
- @fsize 檔案大小
- @fdate 檔案上次修改日期
- @ftime 檔案上次修改時間
所以刪除30天以前的Log檔可以寫成:
forfiles /p D:\Logs\IISLogs /s /m *.log /d –30 /c "cmd /c del @path"
另外我也發現,forfiles 很適合解決之前提過將 DIR 結果轉為檔案清單的需求,還省去 Replace 計算相對路徑的功夫,是更好的選擇:
forfiles /p D:\Set9527 /s /c "cmd /c echo @relpath"
好物一枚,收入命令列工具箱。
Comments
# by snake
hi 你這邊的語法寫錯了 forfiles /p D:\Logs\IISLogs /s /m *.log /d –30 /c "cmd /c delete @path" 是del 謝謝
# by Jeffrey
to snake, 感謝提醒,已更正。
# by how
請問有2000 server的forfiles下載嗎?
# by Jeffrey
to how, Windows 2000 Resource Kit 裡有,但已難尋。要不要試試從新版 Windows 複製過去跑看看。
# by Jacky
forfiles /p "E:\Book\PDF" /s /m *.* /d -2018/12/31 /c "cmd /c move @path F:\Book\OLDPDF" 請問使用forfiles指令搬移就檔到其他資料夾 有甚麼方式可保留原資料夾及檔案的權限
# by Jeffrey
to Jacky, 試試先 XCOPY /X 再 DEL,參考:https://blog.darkthread.net/blog/copy-files-with-acl-settings/
# by Sean
請問我如要刪除多個目錄下的逾期檔案,該如何著手? 是要先將多個目錄建立成一個txt檔,還是有掃描的指令可以使用?