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