linux - 逐个搜索目录(以及任何子目录)中的每个文件
问题描述
我正在尝试遍历目录中的每个文件(包括其子目录中的文件)并在文件满足 if 条件时执行一些操作。
我的部分代码如下:
for f in $direc/*
do
if grep -q 'search_term' $f; then
#action on this file
fi
done
但是,这在子目录的情况下会失败。如果有人可以帮助我,我将不胜感激。
谢谢!
解决方案
是的,因为使用这种语法,grep
期望处理文件而不是目录。对脚本的最小更改是测试是否$f
是文件:
...
if [ -f "$f" ] && grep -q 'search_term' $f; then
...
实际上,您可能希望获取具有模式匹配的文件列表并对其采取行动:
while read f; do
: #action on file file $f
done < <(grep -rl 'search_term' $direc/)
<(list)
我选择通过管道获取文件列表,因为将其导入while
会导致循环内部在另一个进程中运行(这可能是一个问题,特别是如果您希望可以从外部访问任何变量(更改) . 并且不像 simple for with``
它对你遇到的文件名不那么敏感(即我有空格,但这仍然会被换行符混淆)。说到这:
while read -d "" f; do
: #action on file file $f
done < <(grep -rZl 'search_term' $direc/)
没有什么可以混淆这一点,因为条目是由 nul 字符分隔的,并且不能出现在文件名中。
推荐阅读
- java - 如何使用 Java 删除 CSV 文件中的重复列
- java - 如何根据 application.yml 中的键读取值
- css - css 多张带有渐变问题的图像,响应式
- api - REST API 重构
- image - Flutter 使用图像文件加载图像资源
- javascript - 在 JavaScript 中第一个方法完成后运行方法
- python - 合并饼图值但不合并其图例值
- javascript - Laravel 获取 javascript 文件作为语言环境
- laravel - 数据从后端成功返回时,用于登录的 Nuxt Auth 模块不起作用
- node.js - 快递请求.isAuthenticated