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 命令来输出用双引号括起来的文件路径而没有换行符的主要内容,如果未能解决你的问题,请参考以下文章