我试过
find "$1" -print | grep -i '.*[.]c' | sort
查找文件夹中具有.c文件扩展名的所有文件。
1)但我还需要打印出每个c文件的内容。例如,假设有" practice.c"和" practice_1.c"测试文件夹中的文件,
test/practice.c:
void function(int loc)
int function1()
test/practice_1.c:
void function2()
char function3(char locc)
像这样...我只打印出函数名,而不是所有内容。
如果我使用-exec cat,它会打印出所有内容,所以我被困在这里。
----------------------- edit ----------------------- ---------------
find "$1" -type f -name *.c -exec echo {} \; -exec grep "(*)" {} \; | sed 's/{//g'
当我使用上面的代码时,这打印为
test/practice.c
void function(int loc)
int function1()
test/practice_1.c
void function2()
char function3(char locc)
如何将其输出为:
test/practice.c:
void function(int loc)
int function1()
test/practice_1.c:
void function2()
char function3(char locc)
(需要在文件名后添加分号,并在完成一个文件显示后添加新行...)
答案 0 :(得分:1)
首先,不要{gre} find
的输出。您可以改用find
' -iname
选项。要允许其中包含换行符的文件名,请使用-print0
代替-print
。
find "$1" -iname '*.c' -print0 | sort -z
但还有更好的方法:bash
的globstar(参见将事情放在一起)。
在这种情况下,最好使用专用程序而不是一起黑客攻击。 ctags -x
或cscope
似乎可以胜任这项工作。 ctags
输出依赖于文件的格式,因此我们使用indent
自动格式化它们。
要从示例中打印函数定义,请使用以下函数:
printFunctions() {
printf "%s:\n\n" "$1" # filename at the top
indent -l0 -npsl < "$1" > tmp.c
ctags -x tmp.c |
awk '$2 == "function"' |
tr -s ' ' |
cut -d' ' -f5-
rm tmp.c
echo # empty line at the end
}
short -s globstar
for cfile in **/*.c; do
printFunctions "$cfile"
done
答案 1 :(得分:0)
试试这个。如果这符合您的标准。
find "$1" -type f -name *.c -exec echo {}":" \; -exec grep "(*)" {} \; |sed 's/{//g' | awk '{if(($0~/:/)&&(NR>1)){$0="\n"$0};print}'
find "$1" -type f -name *.c -exec echo {}":" \;
###这将找到$ 1文件夹中的所有.c文件。所以* .c表示以.c结尾的文件名,它还附加:输出中的文件名。
-exec grep "(*)" {} \;
###这将在搜索的文件中grep,其中包含(和)我们在命令c函数语法中使用的两个圆括号
| sed 's/{//g'
###搜索到的所有内容都通过管道输入到这个sed命令。由于函数名称具有{在其名称声明之后所以将其删除
awk '{if($0~/:/){$0="\n"$0};print}'
###这里我们在行的开头附加\ n,其中包含: