2014-04-20 56 views
1

我試圖使用一個變量來指定find命令中的排除路徑。如何使用變量指定要在`find`中排除的路徑?

這個片段的工作:

x="*test/.util/*" 
y="*test/sh/*" 

find test -type f -name "*.sh" -not -path "$x" -not -path "$y" 

但我想移動-not -path到變量,如:

x="-not -path *test/.util/*" 
y="-not -path *test/sh/*" 

# error: find: -not -path *test/.util/*: unknown primary or operator 
find test -type f -name "*.sh" "$x" "$y" 

# Tried removing quotes 
# error: find: test/.util/foo.sh: unknown primary or operator 
find test -type f -name "*.sh" $x $y 

我也嘗試添加引號變量中的路徑,但這導致沒有路徑過濾。

# no syntax error but does not exclude the paths 
x="-not -path '*test/.util/*'" 
y="-not -path '*test/sh/*'" 

我正在使用OSX Mavericks; GNU bash,版本3.2.51(1)-release(x86_64-apple-darwin13)。

我在做什麼錯?謝謝

+0

@ chepner的答案是完全正確的,並且是on-point。你也可能會看到BashFAQ#50:http://mywiki.wooledge.org/BashFAQ/050 –

回答

5

find正在接收-not -path *test/.util/*作爲單個參數,而不是它需要的3個單獨的參數。您可以改爲使用數組。

x=(-not -path "*test/.util/*") 
y=(-not -path "*test/sh/*") 

find test -type f -name "*.sh" "${x[@]}" "${y[@]}" 

當引述${x[@]}擴展成一系列單獨的詞,每個數組元素之一,並且每個字保持適當地引用,所以圖案字面上通過,如預期,對find

+0

工作,謝謝! – user46874