grep没有为传递给变量的目录提供任何输出

马蒂·卡加斯(Marty Cagas)

我正在尝试编写一个bash脚本,脚本在指定目录树中的文件内容中搜索是否存在指定的子字符串。

仅使用grep的递归函数是不够的,因为我潜在地需要遍历系统的/目录(和所有子目录),这将grep导致内存不足并中止。因此,我决定使用指定find了传递给脚本的参数的以下变量来获取指定目录树中所有目录和子目录的列表

searchdir=$HOME     # passed in a script argument
searchstr="secret"  # passed in a script argument

我调用该find实用程序并将输出存储到一个临时文件中。

TF=$(mktemp)
find ${searchdir} -type d 1>$TF 2>/dev/null

使用临时文件中所有目录的列表,我继续使用循环来遍历此文件的各行,while-do目的是对每个目录中的所有文件进行搜索。对于grep,我使用此答案中提供的参数格式在单个目录中搜索所有文件,包括隐藏文件。

cat $TF | while read line || [[ -n $line ]];
do
    grepdir="${line}/{*,.*}"
    grep -sHn "${searchstr}" ${grepdir}
done

...但是,该代码不产生任何输出。

我证实了...

${TF}确实包含所有目录的正确列表。输出${grepdir}变量将提供我期望找到的输出。

/home/user/{*,.*}
/home/user/.ssh/{*,.*}
/home/user/test/{*,.*}
# ... and so on

如果我grep使用硬编码目录(尤其是该~/test/目录)运行命令,则该目录包含两个应该带有字符串的测试文件

grep -sHn "${searchstr}" /home/user/test/{*,.*}

...它正确地输出了两个包含子字符串“ secret”的文件。

/home/user/test/asdf:7:secret
/home/user/test/test.txt:5:asdfasfdsecretaasdfafd

一种对我有用的grep格式是答案中最初提到的一种格​​式,该格式讨论了递归使用如果我这样做:

cat $TF | while read line || [[ -n $line ]];
do
    grep -rn "${line}" -e "${searchstr}"
done

...我得到一些输出(技术上正确,但是有很多重复的条目),但是由于grep会递归处理目录,并且我拥有所有目录的列表,因此我必然会多次获得相同的结果,例如前面提到的根目录grep将完全失败,这就是我要避免的事情。


我可能还应该提到,我拼命地使它运行的技巧(例如作为$(echo "${grepdir}")参数传递)也没有导致任何结果。

我的思想或理解极有可能是一个误解bash在调用之前不应该bash扩展${grepdir}变量grep吗?我的脚本哪里出问题了?

G-Man说“恢复莫妮卡”

规则1:当命令或脚本没有执行您想要的操作时,请查看错误消息。  不要把它们扔进去 /dev/null

您收到类似的错误消息

grep: /home/user/{*,.*}: No such file or directory
grep: /home/user/.ssh/{*,.*}: No such file or directory
grep: /home/user/test/{*,.*}: No such file or directory

但您没有看到它们。

如果我们看bash(1),我们看到

拆分成单词后,在命令行上执行扩展。进行了七种扩展:大括号扩展,代字号扩展,参数和变量扩展,命令替换,算术扩展,单词拆分和路径名扩展。

扩展的顺序是:大括号扩展;波浪线扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词 和路径名扩展。

对于您的情况,重要的部分是在可变扩展之前先进行括号扩展。所以,如果你说

grep -sHn "${searchstr}" "${line}"/{*,.*}

然后

  • 大括号扩展会将最后一个令牌转换为"${line}"/*"${line}"/.*
  • 变量扩展会将以上内容转换为/home/user/*/home/user/.*,然后
  • 扩展路径名会将以上内容变成文件名列表。

但是,当你说

grep -sHn "${searchstr}" ${grepdir}

然后

  • 变量扩展将最后一个标记转换为/home/user/{*,.*}

然后为大括号扩张为时已晚。  grep寻找一个字面叫的文件/home/user/{*,.*}


聚苯乙烯

grep -sHn "${searchstr}" "${line}/{*,.*}"

也不起作用,因为引号会阻止括号扩展和路径名扩展的发生。

PPS您不需要所有大括号;

grep -sHn "$searchstr" "$line"/{*,.*}

会没事的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tensorflow:没有为任何变量提供梯度

来自分类Dev

ValueError:没有为任何变量提供渐变(Tensorflow)

来自分类Dev

Keras ValueError:没有为任何变量提供渐变

来自分类Dev

没有为任何变量提供渐变-Keras

来自分类Dev

在tensorflow2.0中没有为任何变量提供梯度

来自分类Dev

TensorFlow 2自定义丢失:“没有为任何变量提供渐变”错误

来自分类Dev

ValueError:没有为任何变量提供渐变-Tensorflow 2.0 / Keras

来自分类Dev

我为什么得到“ ValueError:没有为任何变量提供渐变:['Variable:0']。” 错误?

来自分类Dev

ValueError:没有为任何变量提供梯度,检查你的图表是否支持梯度

来自分类Dev

当 MultivariateNormalDiag() 的 scale_diag 是一个常量时,“ValueError:没有为任何变量提供梯度”

来自分类Dev

ValueError:没有为任何可变自定义损失提供渐变

来自分类Dev

reprepro没有为“ galera”提供任何内容,正在跳过

来自分类Dev

ocamlfind抱怨没有为通过opam安装的模块提供任何实现

来自分类Dev

IOError:[错误2]没有为ouptup文件提供此类文件或目录错误

来自分类Dev

Clojure:“ java.lang.IllegalArgumentException:没有为键提供任何值:”当我更改了require

来自分类Dev

为什么oracle没有为Java Card 3.0.1、3.0.2和3.0.4提供任何开发套件?

来自分类Dev

如果没有为xargs提供任何输入,请不要让xargs运行该实用程序

来自分类Dev

如果没有为强制选项提供任何参数,则zparseopts将下一个选项作为参数

来自分类Dev

“没有为Powershell 4注册任何管理单元”

来自分类Dev

没有为该名称定义任何查询[getAuditTaskById]

来自分类Dev

Dtrace没有为NodeJS收集任何数据

来自分类Dev

django 没有为 .id 或 .pk 返回任何值

来自分类Dev

$ _GET没有为我提供正确的内容

来自分类Dev

没有为以下模块提供实现:Str

来自分类Dev

Angular-没有为FormBuilder提供程序

来自分类Dev

没有为以下模块提供实现:Str

来自分类Dev

RStudio 安装没有为我提供“真正的”RStudio

来自分类Dev

Pandas 没有为数据框提供 corr 矩阵

来自分类Dev

打印报表没有为我提供准确的数字

Related 相关文章

  1. 1

    Tensorflow:没有为任何变量提供梯度

  2. 2

    ValueError:没有为任何变量提供渐变(Tensorflow)

  3. 3

    Keras ValueError:没有为任何变量提供渐变

  4. 4

    没有为任何变量提供渐变-Keras

  5. 5

    在tensorflow2.0中没有为任何变量提供梯度

  6. 6

    TensorFlow 2自定义丢失:“没有为任何变量提供渐变”错误

  7. 7

    ValueError:没有为任何变量提供渐变-Tensorflow 2.0 / Keras

  8. 8

    我为什么得到“ ValueError:没有为任何变量提供渐变:['Variable:0']。” 错误?

  9. 9

    ValueError:没有为任何变量提供梯度,检查你的图表是否支持梯度

  10. 10

    当 MultivariateNormalDiag() 的 scale_diag 是一个常量时,“ValueError:没有为任何变量提供梯度”

  11. 11

    ValueError:没有为任何可变自定义损失提供渐变

  12. 12

    reprepro没有为“ galera”提供任何内容,正在跳过

  13. 13

    ocamlfind抱怨没有为通过opam安装的模块提供任何实现

  14. 14

    IOError:[错误2]没有为ouptup文件提供此类文件或目录错误

  15. 15

    Clojure:“ java.lang.IllegalArgumentException:没有为键提供任何值:”当我更改了require

  16. 16

    为什么oracle没有为Java Card 3.0.1、3.0.2和3.0.4提供任何开发套件?

  17. 17

    如果没有为xargs提供任何输入,请不要让xargs运行该实用程序

  18. 18

    如果没有为强制选项提供任何参数,则zparseopts将下一个选项作为参数

  19. 19

    “没有为Powershell 4注册任何管理单元”

  20. 20

    没有为该名称定义任何查询[getAuditTaskById]

  21. 21

    Dtrace没有为NodeJS收集任何数据

  22. 22

    django 没有为 .id 或 .pk 返回任何值

  23. 23

    $ _GET没有为我提供正确的内容

  24. 24

    没有为以下模块提供实现:Str

  25. 25

    Angular-没有为FormBuilder提供程序

  26. 26

    没有为以下模块提供实现:Str

  27. 27

    RStudio 安装没有为我提供“真正的”RStudio

  28. 28

    Pandas 没有为数据框提供 corr 矩阵

  29. 29

    打印报表没有为我提供准确的数字

热门标签

归档