查找命令路径变量发现无法识别空格

时间:2016-11-04 12:42:25

标签: bash find

我试图迭代地为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 个答案:

答案 0 :(得分: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包含带空格的字符串。

答案 1 :(得分:1)

定义一个函数,而不是尝试动态构造一个命令行。

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

find_with_exclude "Documents/Microsoft User Data"