如何将 shell 通配符传递到反引号命令中

发布于 2024-10-29 21:21:18 字数 440 浏览 7 评论 0原文

我试图在 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'"

,那么 shell 不会扩展星号,但 find 会得到单引号并且不匹配任何内容。

I am trying to use find in a shell script to count the number of files I have matching a wildcard pattern, then to get the name of the file if there is only one. But I'm having trouble passing the wildcard pattern through to backtick expansion.

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

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

That doesn't work: the shell expands DATA.txt at the time of calling find. I want the asterisks to be passed to find.

If I make it

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

Then the shell doesn't expand the asteriks, but find gets the single-quotes and matches nothing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烏雲後面有陽光 2024-11-05 21:21:18

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

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

编辑:

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

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}

Don't put your commands in a variable. What's wrong with just executing the command directly?

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

Edit:

if you wan to reuse the command, use a subroutine

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}
吹梦到西洲 2024-11-05 21:21:18

执行以下两项操作:

  1. 在 find 命令中使用引号: FINDCMD="find . -iname \"*DATA*.txt\""FINDCMD='find . -iname "*DATA*.txt"'
  2. 使用以下 bash 选项:-f 禁用路径名扩展。 如下 set -f 在脚本开头

那应该可以解决问题。虽然没有在您的脚本上进行测试,但您应该从这一点得到这个想法。

Do BOTH of following:

  1. Use quotes in find command: FINDCMD="find . -iname \"*DATA*.txt\"" OR FINDCMD='find . -iname "*DATA*.txt"'
  2. Use following bash option: -f Disable pathname expansion. as follows set -f in the beginning of the script

That should do the trick. Not tested on your script though, but you should get the idea from this point.

暮色兮凉城 2024-11-05 21:21:18

交换单引号和双引号。

尝试:

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

Switch the single and double quotes.

Try:

FINDCMD='find . -iname "*DATA*.txt"'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文