我是bash的总菜鸟,所以这很可能是语法错误,但我在搜索中找不到任何可用于语法的内容。
从终端,运行
find . -name "*g*"
结果
./.grepdir.sh.swp
./grepdir.sh
但是,运行名为grepdir.sh
#!/usr/bin/bash
startdir="$1";
pattern="$2";
find_cmd="find $startdir -name \"$pattern\"";
echo "$find_cmd";
cmd="$($find_cmd)";
echo "$cmd";
来自终端的 grepdir.sh . "*g*"
导致:
[user@pc~/dir]$ grepdir.sh . "*g*"
find . -name "*g*"
[user@pc~/dir]$
表示cmd必须为空。但根据我的理解,执行了存储在find_cmd中的字符串,并将输出捕获到cmd,这意味着它不应该为空。我有误解,或者我的语法是不是很糟糕?
由于
答案 0 :(得分:1)
您的脚本版本的问题在于您添加的引号实际上成为要查找的参数的一部分。因此,您要求它搜索字面上包含带引号的"*g*"
的文件名。
如果您删除添加引号并只说find_cmd="find $startdir -name $pattern";
,那么它适用于不包含特殊字符的模式。然后我想也许这会奏效:
grepdir.sh . \*g\*
甚至
grepdir.sh . \\\*g\\\*
但没有。这些事总是很棘手......
编辑:A-ha,这个版本似乎有效:
#!/usr/bin/bash
startdir="$1";
pattern="$2";
find_cmd="find $startdir -name $pattern";
echo "$find_cmd";
GLOBIGNORE=$pattern
cmd="$($find_cmd)";
echo "$cmd";
答案 1 :(得分:0)
我通常这样做 - >
#!/bin/bash
dir=$1
file="*$2*"
find $dir -iname $file -print