请求修改find命令:排除纯字母文件名并按大小排序
解决方法:筛选包含字母但不全为字母的文件
首先要纠正你原命令里的一个关键错误,再解决“排除仅由字母组成的文件名”的需求:
1. 原命令的隐藏问题
你写的-name '*[:alpha:]*'并没有正确匹配包含字母的文件。因为在find的-name通配符规则中,POSIX字符类(比如[:alpha:])必须包裹在[]中才会生效,否则[:alpha:]会被解析成普通字符集合(即:、a、l、p、h这些字符)。所以你原命令实际上是在找包含这些字符的文件,而不是包含字母的文件。
2. 正确的命令修改
要实现“找到包含字母,但排除仅由字母组成的文件”的需求,你需要:
- 用
-name '*[[:alpha:]]*'来匹配包含至少一个字母的文件 - 用
! -name '[[:alpha:]]*'来排除完全由字母组成的文件(不管文件名长度是1还是更长)
完整命令如下:
find -type f -name '*[[:alpha:]]*' ! -name '[[:alpha:]]*' -exec ls -ltu {} + | sort -k 5 -n -r
3. 命令逻辑拆解
-name '*[[:alpha:]]*':匹配文件名中存在至少一个字母的文件(这才是你原命令想要实现的逻辑)! -name '[[:alpha:]]*':排除所有仅由字母构成的文件名([[:alpha:]]匹配单个字母,*匹配零个或多个后续字母,组合后覆盖所有全字母文件名,比如a、Hello这类)-exec ls -ltu {} +:把所有匹配到的文件一次性传给ls(比{} \;效率更高,因为减少了进程创建次数)sort -k 5 -n -r:按文件大小(第5列)倒序排序,这部分和你原命令一致
4. 验证效果
比如当前目录有这些文件:
abc(全字母)file123.txt(包含字母和数字)123(无字母)a(单个字母)
执行命令后,只会输出file123.txt,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Evgeny
相关产品推荐
相关产品推荐

