我有一个脚本,递归搜索所有目录中的特定文件或特定文件结尾。 这些特定文件我想在描述文件中保存路径。 看起来像这样的例子:
./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
希望有人可以向我解释:) 非常感谢。
答案 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