如何编写删除前缀为logtest且排除自身的批量文件删除命令
问题解答
你尝试的rm -r -- !(logtest.*)未生效有两个核心原因:
!(pattern)是Bash的扩展通配符语法,默认未开启,直接写不会被识别- 匹配规则错误:
!(logtest.*)的逻辑是「排除所有文件名以logtest.开头的文件」,完全不符合你要排除纯logtest文件的需求。
正确实现方案
方案1:Bash扩展通配符(适合当前使用Bash的场景)
首先开启扩展通配符功能:
shopt -s extglob
执行删除命令:
rm -r -- logtest?*
规则说明:?匹配1个任意字符,*匹配0个及以上任意字符,logtest?*刚好匹配所有logtest开头且后面至少有1个字符的文件/目录,天然排除纯logtest文件。
注意:执行删除前可以先运行ls -d logtest?*预览匹配到的文件,确认无误后再执行删除
方案2:find命令(跨Shell通用,更稳妥)
不需要开启任何额外功能,适配所有Shell环境,还可以加更多过滤规则避免误删:
find . -maxdepth 1 -name "logtest?*" ! -name "logtest" -exec rm -r {} +
参数说明:
-maxdepth 1:只扫描当前目录,不会递归到子目录匹配文件,避免误删子目录内的同名文件! -name "logtest":显式排除纯logtest文件,双重保险-exec rm -r {} +:将所有匹配到的文件/目录传给rm -r执行删除
如果只需要删除普通文件不需要删目录,可以调整命令为:
find . -maxdepth 1 -type f -name "logtest?*" -delete
内容的提问来源于stack exchange,提问作者TONY FRANK C
相关产品推荐
相关产品推荐

