使用嵌套命令查找黑名单

时间:2015-12-10 10:29:33

标签: shell sh

我有一个脚本,递归搜索所有目录中的特定文件或特定文件结尾。 这些特定文件我想在描述文件中保存路径。 看起来像这样的例子:

./org/apache/commons/.../file1.pom
./org/apache/commons/.../file1.jar
./org/apache/commons/.../file1.zip

等等。

在黑名单中,我描述了我想忽略的文件结尾。

! -path "./.cache/*" ! -path "./org/*" ! -name "*.sha1" ! -name"*.lastUpdated"

等等。

现在我想在搜索时读取此黑名单文件,忽略所描述的文件:

find . -type f $(cat blacklist) > artifact.descriptor

不幸的是,搜索时不会包含黑名单。 当:

echo "find . -type f $(cat blacklist) > artifact.descriptor"

结果符合预期:

find . -type f ! -path "./.cache/*" ! -path "./org/*" ! -name "*.sha1" ! -name"*.lastUpdated" > artifact.descriptor

但它不起作用或排除所描述的文件。 我尝试使用以下命令并且它可以工作,但我想知道为什么不单独使用。

find . -type f | grep -vf  $blacklist  > artifact.descriptor

希望有人可以向我解释:) 非常感谢。

1 个答案:

答案 0 :(得分:1)

正如tripleee建议的那样,将命令存储在变量中通常被认为是不好的做法,因为它没有捕获所有的角落。 但是you can use eval as a workaround

/tmp/test$ ls
blacklist  test.a  test.b  test.c
/tmp/test$ cat blacklist 
-not -name *.c -not -name *.b
/tmp/test$ eval "find . -type f "`cat blacklist`
./test.a
./blacklist

在你的情况下,我认为它失败了,因为你的黑名单文件中的引号被认为是文字,而不是封闭模式,我认为如果你删除它们就有效,但它仍然可能对其他人不安全的原因。

! -path ./.cache/* ! -path ./org/* ! -name *.sha1 ! -name *.lastUpdated