1

我有一个 C 代码库,都位于同一个目录中。我想找到所有具有相同名称的代码文件的头文件。

现在,我有以下命令:

ls *.h | sed s/.h/.c/

这将返回我要搜索的文件名的“列表”。如何将此列表传递给另一个命令,以便我可以查看哪些头文件具有共享相同名称的代码文件?

4

5 回答 5

6

没有任何外部命令:

$ for i in *.h
> do
>   [ -f  ${i/.h/.c} ] && echo $i
> done

第一行遍历每个文件。

第三行是一个测试构造。(aka )的-f标志检查文件是否存在。如果是,则返回(在 shell 中被认为是真的)。如果上一行成功返回,则只有以下命令才会运行。testman [0&&

${i/.h/.c} 是就地 in-shell 正则表达式替换,因此测试的文件是 .h 对应的 .c。

于 2012-10-25T06:31:13.523 回答
2

您可以使用 xargs 来转换其输入:

a
b
c

到参数列表:

a b c

所以这应该打印“ab c”:

echo -e "a\nb\nc" | xargs echo
于 2012-10-25T06:30:10.500 回答
2
ls `ls *.h|sed s/.h/.c/` 2>/dev/null

应该做的伎俩

于 2012-10-25T06:30:15.377 回答
1
ls *.h | sed s/.h/.c/ | xargs ls 2>/dev/null

该命令的其余部分ls以新的 *.c 文件名再次运行。ls会抱怨每个不存在的文件,所以我们将 stderr 重定向到无处。

没有的例子2>/dev/null

$ ls
a.c a.h b.c c.c d.h
$ ls *.h | sed s/.h/.c/ | xargs ls
ls: d.c: No such file or directory
a.c
于 2012-10-25T06:30:30.433 回答
1
ls -1 *.c* *.h*|awk -F. '{a[$1]++}END{for(i in a){if(a[i]==2)print i".hh"} }'
于 2012-10-25T06:34:47.323 回答