3

我试图在 shell 脚本中使用 find 来计算与通配符模式匹配的文件的数量,然后如果只有一个,则获取文件的名称。但是我在将通配符模式传递给反引号扩展时遇到了麻烦。

FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)

if [ $DATACOUNT -eq 1 ]
then
  use-data $($FINDCMD)
else
  echo bugger
fi

这不起作用:shell 在调用 find 时扩展了DATA .txt。我希望通过星号来查找。

如果我成功了

FINDCMD="find . -iname '*DATA*.txt'"

然后外壳不会扩展星号,但 find 获取单引号并且不匹配任何内容。

4

3 回答 3

1

不要将您的命令放在变量中。直接执行命令有什么问题?

DATACOUNT=$(find . -iname "*DATA*.txt" | wc -l)
if [ $DATACOUNT -eq 1 ];then
    .....
fi

编辑:

如果您想重用该命令,请使用子例程

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}
于 2011-04-01T08:32:52.143 回答
1

执行以下两项操作:

  1. 在 find 命令中使用引号:FINDCMD="find . -iname \"*DATA*.txt\""FINDCMD='find . -iname "*DATA*.txt"'
  2. 使用以下 bash 选项:在脚本开头-f Disable pathname expansion.如下所示set -f

这应该够了吧。虽然没有在你的脚本上测试过,但你应该从这一点得到这个想法。

于 2011-08-01T08:30:00.950 回答
-1

切换单引号和双引号。

尝试:

FINDCMD='find . -iname "*DATA*.txt"'
于 2011-04-04T08:40:53.590 回答