Bash 脚本 - 需要 find 命令来输出用双引号括起来的文件路径,没有换行符
Bash Script - Need find command to output file paths enclosed in double quotes without line breaks
我一直在使用 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
'
请帮助我提供一个适当的命令,我可以在我的 alias/function 中使用该命令来获得带有双引号的文件名,而路径不会被多行中断。
我没有理由 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
如果您有包含空格、双引号 and/or 反斜杠的不寻常文件名,您可以添加 post-处理,例如 sed
:
sed -i 's/["\]/\&/g;s/^\|$/"/g' cscope.files
这将在任何双引号或反斜杠之前添加一个反斜杠,并对所有文件名加上双引号。将此 sed
命令添加到函数定义中,在 find
命令之后。
我一直在使用 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
'
请帮助我提供一个适当的命令,我可以在我的 alias/function 中使用该命令来获得带有双引号的文件名,而路径不会被多行中断。
我没有理由 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
如果您有包含空格、双引号 and/or 反斜杠的不寻常文件名,您可以添加 post-处理,例如 sed
:
sed -i 's/["\]/\&/g;s/^\|$/"/g' cscope.files
这将在任何双引号或反斜杠之前添加一个反斜杠,并对所有文件名加上双引号。将此 sed
命令添加到函数定义中,在 find
命令之后。