如何删除foo、bar目录下文件名数字为奇数的txt文件?
原代码错误原因
expr match "$file" '[0-9]'只会匹配文件路径开头的数字,如果你拿到的路径是./foo/1.txt这类带前缀的格式,根本提取不到文件名里的数字,返回值为空直接导致判断逻辑失效- 取余运算没有做算术展开,
%会被识别为普通字符串,数值判断逻辑完全不生效
可行解决方案
方案1:直接匹配奇数文件名删除(最高效,无额外逻辑)
直接通过文件名通配匹配你要删除的奇数命名文件,一步完成操作:
find ./foo ./bar -type f -name "[13579].txt" -delete -print
参数说明:
- 直接指定扫描
./foo和./bar两个目标目录,避免误扫其他路径 -name "[13579].txt"精准匹配文件名是1、3、5、7、9的txt文件,完全覆盖你要删除的奇数文件范围-delete执行删除操作,-print会输出已删除的文件路径,替代原代码中rm -v的效果
方案2:保留循环判断逻辑(适合后续需要扩展其他判断规则的场景)
如果一定要用提取数字判断奇偶的逻辑,修正后的代码如下:
find ./foo ./bar -type f -regextype egrep -regex '.*/[0-9]\.txt' | while read -r file; do # 提取文件名中的纯数字部分,自动忽略路径前缀和.txt后缀 num=$(basename "$file" .txt) # 判断为奇数就删除 [ $(( num % 2 )) -eq 1 ] && rm -v "$file" done
操作提示
删除前可以先去掉删除参数,先打印待删除的文件列表确认无误再执行操作,避免误删:
# 测试方案1的匹配结果 find ./foo ./bar -type f -name "[13579].txt" -print
内容的提问来源于stack exchange,提问作者Nourless
相关产品推荐
相关产品推荐

