批量删除目录树中各子目录下的最旧文件
删除每个Game子目录下的最旧文件
Linux/macOS 解决方案
方法一:用ls命令快速实现
find Games -type d -name "Game*" | while read dir; do # 过滤掉目录,按修改时间新→旧排序后取最后一个(最旧) oldest_file=$(ls -tp "$dir" | grep -v / | tail -n 1) # 存在文件才执行删除,避免空值报错 if [ -n "$oldest_file" ]; then rm -v "$dir/$oldest_file" fi done
ls -tp "$dir":列出目录内容,-t按修改时间从新到旧排序,-p给目录名加/后缀方便区分grep -v /:只保留文件,排除子目录tail -n 1:拿到排序后的最后一行,也就是最旧的文件
方法二:用find+stat更精准(推荐)
如果担心ls的格式在不同环境下有差异,用这个更可靠:
find Games -type d -name "Game*" | while read dir; do # 列出当前目录下的文件,输出修改时间戳+路径,按时间戳从小到大排序后取第一个 oldest_file=$(find "$dir" -maxdepth 1 -type f -printf '%T@ %p\n' | sort -n | head -n 1 | awk '{print $2}') if [ -n "$oldest_file" ]; then rm -v "$oldest_file" fi done
%T@:输出文件的修改时间戳(精确到秒的浮点数),保证排序绝对准确sort -n:按数字从小到大排序,最旧的文件会排在最前面
Windows 解决方案
PowerShell 脚本(简单直观)
Get-ChildItem -Path "Games" -Directory -Filter "Game*" | ForEach-Object { # 获取目录下所有文件,按修改时间从旧到新排序,取第一个 $oldestFile = Get-ChildItem -Path $_.FullName -File | Sort-Object LastWriteTime | Select-Object -First 1 if ($oldestFile) { Remove-Item -Path $oldestFile.FullName -Verbose } }
直接复制到PowerShell窗口运行即可,-Verbose会显示每个被删除的文件路径。
CMD 批处理脚本
如果只能用原生CMD,用forfiles实现:
@echo off setlocal enabledelayedexpansion for /d %%d in (Games\Game*) do ( # 列出文件的日期、时间和路径,倒序后取最后一个(最旧) for /f "delims=" %%f in ('forfiles /p "%%d" /m *.* /c "cmd /c echo @fdate @ftime @path" | sort /r | tail -n 1') do ( # 去掉字符串前面的日期和时间,只保留文件路径 set "fullpath=%%f" set "fullpath=!fullpath:* =!" set "fullpath=!fullpath:* =!" echo Deleting !fullpath! del "!fullpath!" ) ) endlocal
注意:这个脚本需要系统里有tail命令(比如安装Git Bash后会自带),如果没有tail,可以用findstr替代取最后一行,但操作相对繁琐。
内容的提问来源于stack exchange,提问作者roughnecks
相关产品推荐
相关产品推荐

