我试图运行find
,并排除了数组中列出的几个目录。我发现时,它的扩大,虽然,这是造成我的问题有些怪异的行为:在bash中扩展星号
~/tmp> skipDirs=("./dirB" "./dirC")
~/tmp> bars=$(find . -name "bar*" -not \(-path "${skipDirs[0]}/*" $(printf -- '-o -path "%s/\*" ' "${skipDirs[@]:1}") \) -prune); echo $bars
./dirC/bar.txt ./dirA/bar.txt
这并没有跳过dirC
我尔德预料。问题在于印刷品在"./dirC"
附近展开报价。
~/tmp> set -x
+ set -x
~/tmp> bars=$(find . -name "bar*" -not \(-path "${skipDirs[0]}/*" $(printf -- '-o -path "%s/*" ' "${skipDirs[@]:1}") \) -prune); echo $bars
+++ printf -- '-o -path "%s/*" ' ./dirC
++ find . -name 'bar*' -not '(' -path './dirB/*' -o -path '"./dirC/*"' ')' -prune
+ bars='./dirC/bar.txt
./dirA/bar.txt'
+ echo ./dirC/bar.txt ./dirA/bar.txt
./dirC/bar.txt ./dirA/bar.txt
如果我尝试删除在$(print..)
的报价,那么*
被立即展开,这也给了错误的结果。最后,如果我删除引号并尝试转义*
,那么\
转义字符将作为文件名的一部分包含在查找中,但这也不起作用。我想知道为什么上述不起作用,什么工作?如果可能,我尽量避免使用eval
,但目前我没有看到解决方法。
注意:这非常类似于:Finding directories with find in bash using a exclude list,但是,该问题的发布解决方案似乎有我上面列出的问题。
同样的问题的细微变化是http://stackoverflow.com/q/28682013/45375 – mklement0 2015-02-24 22:15:11