在文件夹中按扩展名查找文件并显示其内容

时间:2018-03-21 16:06:45

标签: regex shell find

我需要做的是在文件夹及其子文件夹中找到所有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不是文件夹"

有人可以帮我解决这个问题吗?几个小时我一直困在这个问题......如果有人炸毁我的困惑,我会非常感激...谢谢!

1 个答案:

答案 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)