Bash 脚本 - 需要 find 命令来输出用双引号括起来的文件路径而没有换行符

Posted

技术标签:

【中文标题】Bash 脚本 - 需要 find 命令来输出用双引号括起来的文件路径而没有换行符【英文标题】:Bash Script - Need find command to output file paths enclosed in double quotes without line breaks 【发布时间】:2022-01-20 03:24:23 【问题描述】:

我一直在使用 cscope/ctags 数据库。但是过了一段时间,我注意到我的 cscope.files 中存储我的 find 命令结果的一些文件被分成两行或多行。这会导致它们在索引时被 cscope/ctags 忽略。

目前我在别名中使用它:

alias prp_indx='
    rm cscope.in.out cscope.out cscope.files tags
    find . -name '\''*.[chS]'\'' >> cscope.files
    find . -name '\''*.cpp'\'' >> cscope.files
    find . -name '\''*.hpp'\'' >> cscope.files
    find . -name '\''*.cxx'\'' >> cscope.files
    find . -name '\''*.hxx'\'' >> cscope.files
    cscope -b -q -k; ctags -R
'

请帮助我使用适当的命令,我可以在别名/函数中使用该命令来实现带双引号的文件名,而不会在多行中中断路径。

【问题讨论】:

为什么你的名字模式中有反斜杠。它们真的是您要查找的文件名的一部分吗?列出所有 C++ 源文件 find . -name '*.cpp' >> cscope.files 就足够了。注意:首选函数。与函数相比,别名主要有缺点。 如果您需要名称中包含换行符的文件,您可以使用find 的选项-print0。它用空字符而不是换行符分隔结果。当然任何程序在处理结果之后,也必须将 0 字符理解为分隔符。 具体的错误可能在于您在 -name 参数周围使用的疯狂引用。但正如 Renaud 的回答中已经指出的那样,直接的解决方法是不要为此(或任何东西)使用别名。 【参考方案1】:

我没有想到 find 将文件名分成几行的理由,除非名称本身包含换行符。

如果你有这样的文件名,最好重命名这些文件,因为我认为cscope 并不真正支持包含换行符的文件名。至少,我认为没有办法在cscope.files 文件中列出此类文件,即使是引用或任何形式的转义(但如果您知道该怎么做,请告诉我们,以便我们可以适应随之而来的内容)。因此,您能做的最好的事情就是让cscope 进行搜索(-R),而不是提供cscope.files 文件。如果您这样做,cscope 确实会找到并分析这些文件,但是,当您与cscope 交互时,您会发现它会混淆并拆分名称......

如果您没有此类不寻常的文件名,但您的 cscope.files 文件中有不需要的换行符,则肯定有其他东西对其进行了篡改。

无论如何,更喜欢一个函数。与函数相比,别名主要有缺点。使用bash 函数:

prp_indx () 
  rm cscope.in.out cscope.out cscope.files tags
  find . -name '*.[chS]' -o -name '*.[ch]pp' -o -name '*.[ch]xx' > cscope.files
  cscope -b -q -k
  ctags -R "$@"

注意:如果您的目录名称与 3 种模式之一匹配,请添加 -type 测试以排除目录:

find . ! -type d \( -name '*.[chS]' -o -name '*.[ch]pp' -o -name '*.[ch]xx' \) > cscope.files

如果您有包含空格、双引号和/或反斜杠的异常文件名,您可以添加后处理,例如 sed

sed -i 's/["\]/\\&/g;s/^\|$/"/g' cscope.files

这将在任何双引号或反斜杠之前添加一个反斜杠,并为所有文件名加上双引号。将此sed 命令添加到函数定义中,在find 命令之后。

【讨论】:

以上是关于Bash 脚本 - 需要 find 命令来输出用双引号括起来的文件路径而没有换行符的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本

如何在 bash 脚本中使用 find 命令检查目录大小

在简单的 bash 脚本中使用 find 命令和 if 语句

shell脚本白话知识点(原创)

如何在 bash 脚本中处理 find 的结果?

Linux 第17天 bash,find,正则,命令历史