我需要做的是在文件夹及其子文件夹中找到所有c文件(.c文件扩展名)。还需要打印每个c文件的函数名称(而不是整个内容)。
到目前为止我所做的是:
find "$1" -type f -name *.c -exec echo {}":" \; -exec grep -i "(*)" {} \;
但问题是,它应该像这样打印:
fs/folder/a.c:
int test_function()
fs/project_1/src/b.c:
void test_function_1(int loc)
int test_function_2(int loc)
fs/project_1/util/c.c:
FILE* test_function_3(char* name)
void test_function_4(FILE* file)
void test_function_5(FILE* file)
但我上面写的shell脚本打印出来像这样:
fs/folder/a.c:
int test_function() {
fs/project_1/src/b.c:
void test_function_1(int loc) {
int test_function_2(int loc) {
fs/project_1/util/c.c:
FILE* test_function_3(char* name) {
void test_function_4(FILE* file) {
void test_function_5(FILE* file) {
1)有没有办法删除那些" {"正则表达式,并在每个文件之间添加新行?
2)另外,当我执行程序时,作为输出打印的文件的顺序总是不同的。可以分类吗? (当我尝试-exec sort {} \时,这会使输出完全错误...)
3)最后,如何输入(文件夹名称)时出现错误信息 不是文件夹? (例如)执行时./findfn.sh abcd< - 错误" abcd不是文件夹"
有人可以帮我解决这个问题吗?几个小时我一直困在这个问题......如果有人炸毁我的困惑,我会非常感激...谢谢!
答案 0 :(得分:1)
您可以使用printf
:
find "$1" -type f -name '*.c' -exec printf '\n%s:\n' {} \; -exec grep -i "(.*)" {} \;
然而,这种方法会更有效率,因为它避免了为每个文件分配子shell:
while IFS= read -rd '' file; do
printf '%s:\n' "$file"
if grep -c '(.*)' "$file"; then
grep "(.*)" "$file" | sed 's/{//g'
else
echo 'no functions'
fi
echo
done < <(find "$1" -type f -name '*.c' -print0)