【问题标题】:"find" removing multiple spaces in bash“查找”删除bash中的多个空格
【发布时间】:2012-03-31 21:24:36
【问题描述】:

我在 bash 脚本中有一行使用 find 搜索文件夹并存储其路径。

行如下:

findfolder=$(eval echo $(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1" ))

它几乎在任何情况下都有效,但是,由于某种原因,如果我搜索一个包含两个空格的文件夹,它将返回一个路径,其中所有双空格都已被单个空格切换。

所以,如果我正在搜索名为“我的音乐”的文件夹,其中“我的”和“音乐”之间有两个空格,它将返回“我的音乐” 一个空格。

如果我直接在终端中运行完全相同的命令,我会得到正确的文件夹。

为什么会这样? (如果需要更多代码,请告诉我。虽然我从终端运行了完全相同的命令,但似乎不相关。现在我们不需要无缘无故的文字墙)。

编辑:

它现在正在工作。第一个 eval 或 echo(不确定,但我的测试表明它是 eval)导致输出崩溃,删除了“不必要的”间距。工作代码是:

findfolder="$(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1" )"

【问题讨论】:

  • 有趣。但是你需要双 $($()) 和 evals 吗?
  • @PéterVarga 好吧,在我使用 eval 之前我没有让它工作。他们解决了使用 echo 将结果分配给变量的问题。
  • @PéterVarga 我现在解决了。不需要第一个 eval 和 echo,并且导致崩溃。奇怪的是我在某些时候发现它们是必要的
  • 第二个eval 也不需要,并且在某些情况下会导致解析问题(例如,如果 $find_regex 匹配当前目录中的多个文件,或者它或 $HOME 包含空格, ETC)。顺便说一句, $find_regex 不是 一个正则表达式,它是一个模式,这是完全不同的。例如,“xy?”因为正则表达式匹配 0 个或多个“x”es,后跟可选的“y”。 “xy?”因为模式匹配单个“x”,后跟任意字符序列,后跟“y”,后跟任意单个字符。
  • @GordonDavisson 是的,关于模式与正则表达式的关系是正确的。重命名应该可以解决这个问题。但是您对查找多个文件的问题是错误的。并且 $home 和 $findregex 都不包含空格(或者在我的情况下永远不会包含空格)。不过,我认为您没有必要这样做是对的:)

标签: bash find echo


【解决方案1】:

我不明白你想用 eval 语句做什么。但是,您可以尝试引用命令替换。请注意以下两个命令行的区别:

# the two spaces between foo and bar are collapsed
echo $( echo "foo  bar" )

# the two spaces between foo bar bar are kept
echo "$( echo "foo  bar" )"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多