我经常不得不在文件中进行递归搜索。厌倦了一直输入整个“find/grep”组合,我刚刚创建了一个包含以下行的脚本:
find . -name $1 -exec grep $2 {} + 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
这个想法是我应该能够运行它,例如:
myfind '*' hello
Run Code Online (Sandbox Code Playgroud)
问题是,当'*'传递到脚本中时,脚本会将其扩展到目录中的每个文件。
我试着引用$1:
find . -name '$1' -exec grep $2 {} + 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但是,这会$1变成文字字符串。
感谢您帮助找到正确的语法。一定是我缺少的一些简单的东西。
Oli*_*Oli 11
我在这里演示了这个问题:
$ pie() { echo $1; }; pie '*'
1 2 3 4 5 file
Run Code Online (Sandbox Code Playgroud)
扩大。打扰。
但解决方案非常简单。你只需要引用它,但以一种bash会理解的方式。我们使用双引号。它将被变量内容替换,但不会被扩展。
$ pie() { echo "$1"; }; pie '*'
*
Run Code Online (Sandbox Code Playgroud)
小智 5
您需要熟悉有关变量 shell 扩展的基本规则。
NAME="start"
Run Code Online (Sandbox Code Playgroud)
如果您将 $NAME 提供给 shell,它将被扩展为字符串start
如果在字符串周围加上单引号,shell 不会扩展单引号内的任何内容,因此 '$NAME' 保持为 $NAME
现在使用双引号,shell 将变量 $NAME 扩展为字符串开始,但双引号防止了所谓的文件通配。
你问什么是文件通配?
好吧,你这样做
ls -l *
Run Code Online (Sandbox Code Playgroud)
您希望 ls 命令列出所有文件。不是 ls 将 * 转换为目录中的所有文件名,而是 shell。
现在假设您的目录中有一个名为 * 的文件并且您只想列出该文件,那么您可以使用
ls -l '*'
Run Code Online (Sandbox Code Playgroud)
或者
ls -l "*"
Run Code Online (Sandbox Code Playgroud)
并且单引号和双引号都可以防止 shell 将 * 扩展到文件列表。
也可以通过执行关闭 Globbing
set noglob
Run Code Online (Sandbox Code Playgroud)
与其将这个简单的查找字符串作为一个单独的 shell 脚本,每次使用时都需要调用一个新的 shell,更有效的方法是创建一个 shell 函数 fs (find_string)
function fs ()
{
\find . -type f -name "${1}" -exec egrep --color "${2}" {} /dev/null \;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29443 次 |
| 最近记录: |