【问题标题】:bash script - executing find command gives no outputbash 脚本 - 执行 find 命令没有输出
【发布时间】:2015-06-17 18:30:34
【问题描述】:

我是 bash 的菜鸟,所以这很可能是语法错误,但我在搜索中找不到任何适合我的语法的东西。

从终端,运行
find . -name "*g*"
结果

./.grepdir.sh.swp  
./grepdir.sh

但是,运行 这个 bash 脚本 称为 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,这意味着它不应该为空。我有什么误解,还是我的语法太糟糕了?

谢谢

【问题讨论】:

  • 使用cmd=$(bash -c "$find_cmd") 似乎可以解决这个问题。但我不明白你的不工作的原因。

标签: linux bash shell find


【解决方案1】:

您的脚本版本的问题在于您添加的引号实际上成为要查找的参数的一部分。因此,您要求它搜索包含 "*g*" 和引号的文件名。

如果您放弃添加引号而只说find_cmd="find $startdir -name $pattern";,那么它适用于不包括特殊字符的模式。然后我想也许这会起作用:

grepdir.sh . \*g\*

甚至

grepdir.sh . \\\*g\\\*

但没有。这些事情总是很棘手....

编辑:啊哈,这个版本似乎可以工作:

#!/usr/bin/bash
startdir="$1";
pattern="$2";
find_cmd="find $startdir -name $pattern";
echo "$find_cmd";

GLOBIGNORE=$pattern
cmd="$($find_cmd)";
echo "$cmd";

【讨论】:

  • 您没有使用 C 进行编码,因此没有实际理由使用 ; 元字符来结束每一行。
  • 对,我没有注意到,我只是复制了原件。但我没有添加 ;到我添加的额外行。 :-)
  • +1。但真正的答案只是don't put commands and arguments in a variable
  • 经过更多思考,我认为问题出在通配符上。谢谢!
【解决方案2】:

我通常是这样的-->

#!/bin/bash
dir=$1
file="*$2*"
find $dir -iname $file -print

【讨论】:

  • 您应该包括对您的代码的解释。描述此代码解决问题的方式和原因更有用,因为它有助于 OP 和其他读者自己解决此问题和类似问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多