【发布时间】:2013-02-25 20:53:33
【问题描述】:
更新:
再次尝试后,结果证明该脚本完全按照应有的方式工作。我一定是太累了,做了一些愚蠢的事情,让我认为剧本是错误的,而实际上是我自己。 :-(
非常感谢您的帮助 chepner、shellter、William、glenn 和 Jonathan,我想我的困惑实际上是由我在当前目录“执行查找”引发的。
感谢您的提示!
此线程已准备好关闭。
考虑以下几点:
find . | grep -E ".*\.log$"如果这是在命令行运行,它会按预期工作,即 打印出所有以
.log结尾的目录和文件但是在脚本中,例如:
#!/bin/sh find . | grep -E ".*\.log$"它失败了。打开
set -x进行检查时,我注意到在 脚本执行正则表达式 .*.log$ 是 (auto-??) 用单引号引用,例如:\+ find . \+ grep -E '.*\.log$'即使我的代码包含双引号。 我该如何预防 这个?
限制:
- 挑战是同时使用
find和grep,不允许使用其他命令- 同样,挑战在于使用 both,而不仅仅是
find,因为有人可能想要建议- 进一步的信息,用于
grep的正则表达式比这里显示的要复杂得多(几个OR分开 RegExps),我在这里对其进行了简化,因为这很烦人 一个已经我已经为此工作了 4 多个小时,但没有结果。我搜索过 谷歌和 StackOverflow,但我没有发现任何相似之处。我担心 解决方案非常简单,我太愚蠢了,找不到它? :-(
任何帮助表示赞赏,谢谢!
【问题讨论】:
-
shell 只是以规范的形式回显命令。
'.*.log$'和".*\\.log$"产生等效的字符串。 “失败”是什么意思?没有输出?输出不正确,如果是,那是什么?另外,您是否从运行find命令的同一目录运行脚本? -
是的,不用担心
'.*\.log$',这只是显示跟踪信息的一种标准化方式。在您的脚本中的findcmd 之前添加一个echo $PWD,我会让您看到您没有在您认为自己所在的目录中开始搜索。 -
在这种情况下,您的双引号所做的唯一事情就是变成“\\.”。进入“\.”,这就是您在 -x 输出中看到的内容(以及您想要的内容)。
-
您的查找位置是“。” -- 当前目录。您的脚本是否位于正确的位置?你需要在脚本中
cd吗? -
@chepner 我所说的“失败”是指它只是打印出所有内容,而不是像我预期的那样只打印日志文件。
标签: shell command-line grep find