如何使用Bash查找文件夹内内容包含自身文件名的文件?
用Bash筛选内容包含自身文件名的文件
方法1:遍历当前目录的普通文件
直接用shell循环配合grep实现,适合只处理当前目录的场景:
for file in *; do if [ -f "$file" ]; then grep -q "$file" "$file" && echo "$file" fi done
各部分说明:
for file in *:遍历当前目录下的所有条目[ -f "$file" ]:只处理普通文件,跳过目录、符号链接等非文件类型grep -q "$file" "$file":-q是静默匹配模式,不输出匹配内容,仅返回结果状态;第一个"$file"是要搜索的文件名,第二个是目标文件&& echo "$file":如果grep找到匹配(文件内容包含自身文件名),就输出该文件名
方法2:递归处理所有子目录文件
如果需要覆盖子目录里的文件,用find命令更高效:
find . -type f -exec sh -c 'grep -q "$(basename "$1")" "$1" && echo "$1"' sh {} \;
各部分说明:
find . -type f:从当前目录开始,递归查找所有普通文件-exec sh -c '...' sh {} \;:对每个找到的文件执行内嵌的shell脚本basename "$1":提取文件的纯文件名(去掉路径部分),避免因内容里没有完整路径导致漏判- 同样通过
grep -q判断匹配,符合条件就输出文件的完整路径
额外提示
- 如果需要忽略大小写匹配,给grep加上
-i参数,比如grep -qi "$file" "$file" - 命令里的双引号已处理文件名含空格、特殊字符(如
*、?)的情况,无需额外转义
内容的提问来源于stack exchange,提问作者Goraj
相关产品推荐
相关产品推荐

