参数扩展不适用于" find -exec"

时间:2016-10-26 12:02:07

标签: bash shell

我正在编写如上所述的 bash脚本,但参数扩展不适用于EXC变量。

#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find /path -exec grep ${EXC} "xxx" {} \; >> result.txt

EXC调用未使用grep变量中的选项,因为它仍会解析JavaScript文件......

也试过

find /path -exec grep $EXC "xxx" {} \; >> result.txt

5 个答案:

答案 0 :(得分:1)

您可以使用find(非)运算符与!选项结合来过滤-name个结果。要排除.js.sh个文件:

find . -type f ! -name '*.js' ! -name '*.sh' -exec grep xxx  {} \;

答案 1 :(得分:0)

它仍然会解析,或者只是通过查找您尝试排除的文件来应用它?

无论如何,为什么不只使用 grep -r 而不是 find 加上 grep

grep -r --exclude='*.js' --exclude='*.sh' "xxx" /path

答案 2 :(得分:0)

  

问题在于我使用变量来保存一些参数,并且参数扩展不会在命令行中用$ {}替换它的值...

你可以启动一个可以执行你想要的子shell

#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find /path -exec bash -c "grep ${EXC} 'xxx' {}" \; >> result.txt

答案 3 :(得分:0)

问题是单引号未从参数扩展中删除,因此grep正在接收'*.js'作为模式,而不是*.js。您需要使用数组来保存参数:

exc=( "--exclude=*.js" "--exclude=*.sh" )  # No single quotes needed
find /path -exec grep "${exc[@]}" "xxx" {} \; >> result.txt

引用的参数扩展会阻止*.js*.sh被shell扩展,就像在字面上使用它时引用它们一样。 --exclude='*.js''--exclude=*.js'都会导致相同的参数传递给grep,极简主义--exclude=\*.js也是如此。您也可以将数组定义为

exc=( --exclude "*.js" --exclude "*.sh" )

因为long选项及其参数可以指定为包含=的单词或两个单独的单词。

答案 4 :(得分:0)

这些可以帮到你;

#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find  /path -exec echo "grep ${EXC} 'xxx' {}" \; | bash > result.txt

#!/bin/bash
EXC="*js,*sh"
find  /path -exec echo "grep --exclude={${EXC}} 'xxx' {}" \; | bash  > result.txt