2016-11-04 96 views
0

我試圖迭代組成一個查找目錄排除列表。 我通過迭代文本文件來構建排除路徑。這是所有工作,但我遇到了一個絆腳石,當涉及到他們的空間的路徑。如果我用空格傳遞一個路徑Find不能識別它們。儘管路徑是演講中,標誌着查找命令路徑變量查找不識別空格

這表明:

#### 
line="Documents/Microsoft User Data" 
excludehead="-not (-path " 
excludetail=" -prune)" 
excludefolder="$HOME/$line" 

### 
base_list=$(printf %s "$excludehead" "\"$excludefolder\"" "$excludetail") 
find $HOME $base_list -name "*[<>:/|?#%\\\\*]*" 

這導致:

find: User": unknown primary or operator 

回答

2

這是你必須使用一個shell數組:

find_opts=(-not "(" -path "$HOME/$line" -prune ")") 
find "$HOME" "${find_opts[@]}" -name ... 

你可以看到陣列包含的內容:

$ declare -p find_opts 
declare -a find_opts='([0]="-not" [1]="(" [2]="-path" [3]="/home/jackman/Documents/Microsoft User Data" [4]="-prune" [5]=")")' 

請注意,元素#3包含一個帶空格的字符串。

+0

謝謝,這很適合我的場景 – rndy

1

定義一個函數,而不是試圖動態地構建命令行。

find_with_exclude() { 
    find "$HOME" -not \(-path "$HOME/$1" -prune \) -name "*[<>:/|?#%\\\\*]*" 
} 

find_with_exclude "Documents/Microsoft User Data"