Unix Shell练习:筛选文件名4字符且含"user"内容的文件
解决Unix Shell筛选文件的问题
嘿,我来帮你搞定这个Shell任务!你已经找对了几个关键工具,现在只需要把它们巧妙组合起来就行~
最简洁可靠的方法:用find命令一步到位
直接用find的匹配条件就能同时搞定文件名长度和内容匹配的要求,命令如下:
find . -type f -name "????" -exec grep -q "user" {} \; -print
我来拆解下每个部分的作用:
.:从当前目录开始递归搜索(如果不想递归搜索子目录,可加上-maxdepth 1参数限制在当前目录)-type f:只筛选普通文件,排除目录、符号链接这些非文件类型-name "????":?是Shell通配符,代表单个任意字符,四个?就匹配正好4个字符的文件名-exec grep -q "user" {} \;:对每个找到的文件执行grep检查,-q是静默模式——只要文件里找到"user"就立刻返回成功,不会输出任何内容,这样find就会继续执行后面的-print-print:当前面所有条件都满足时,打印出这个文件的路径
另一种管道写法(适合习惯管道的场景)
如果你更喜欢用管道组合命令,也可以这么写,用grep -l只输出匹配的文件名:
find . -type f -name "????" | xargs grep -l "user"
如果你的文件名里可能包含空格或特殊字符,建议加上-print0和-0来避免出错:
find . -type f -name "????" -print0 | xargs -0 grep -l "user"
回应你之前尝试的思路
你提到用basename和wc -c统计文件名长度,这个思路也能实现,但要注意wc -c会把换行符算进去——4个字符的文件名,basename输出的内容是4个字符加一个换行,所以统计出来是5字节。对应的脚本写法如下:
for file in *; do # 先判断是不是普通文件,再判断文件名长度(含换行的字节数是5) if [ -f "$file" ] && [ "$(basename "$file" | wc -c)" -eq 5 ]; then # 检查文件内容是否含"user",是的话就打印文件名 grep -q "user" "$file" && echo "$file" fi done
不过这个方法只能搜索当前目录,不能递归子目录,所以还是find的方法更通用~
内容的提问来源于stack exchange,提问作者Ruben Cohen
相关产品推荐
相关产品推荐

