find 无法处理 -path 或 -iregex 等字符串变量中的空格

find 无法处理 -path 或 -iregex 等字符串变量中的空格

-path 或 -iregex find 选项的字符串变量中不能有空格。
该输入'/home/demo.*/\.config/File System/.*t$'
被馈送到:

read i


m="-iregex $i"
find ~ $m

如果是常量而不是变量,则不会起作用,所以也不
是 ,正确的解决方案是怎样的?find ~ \'$m\'eval find ~ \'$m\'

答案1

不要将操作放入包含数据的字符串变量中(请参阅Bash 常见问题解答 50)。使用变量时始终用双引号引起来

i='/home/demo.*/\.config/File System/.*t$'
find ~ -iregex "$i"

如果您想包含-iregex唯一的 if$i不为空,那么您可以执行类似的操作,保留它但将正则表达式替换为.*(即任何内容)

find ~ -iregex "${i-.*}"

如果您使用的是诸如bash(但不是sh)之类的能够理解数组的 shell,则可以使用一个 shell 来-iregex仅在需要时包含

IFS= read -r i

findRegex=()
[[ -n "$i" ]] && findRegex=('-iregex' "$i")

find ~ "${findRegex[@]}"

要查看这里发生了什么,您可以修改findecho find.阅读man bash和搜索Arraysand/or@也可能有帮助。

请注意,我还将您的更改read iIFS= read -r i.这会阻止 shell 尝试解析您的输入数据,这可能会破坏包含多个空格($IFS准确地说是字符)和其他字符组合的表达式

相关内容