我有一个C代码库,它们都驻留在同一个目录中。 我想找到所有具有相同名称的代码文件的头文件。
现在,我有以下命令:
ls *.h | sed s/.h/.c/
这将返回我要搜索的文件名“列表”。如何将此列表传递给另一个命令,以便我可以看到哪些头文件具有共享相同名称的代码文件?
答案 0 :(得分:6)
没有任何外部命令:
$ for i in *.h
> do
> [ -f ${i/.h/.c} ] && echo $i
> done
第一行循环遍历每个文件。
第三行是测试构造。 -f
的{{1}}标志(又名test
)会检查文件是否存在。如果是,则返回man [
(在shell中被认为是真的)。如果上一行成功返回,则0
仅在以下命令运行。
$ {i / .h / .c}是一个就地的shell内正则表达式替换,因此测试的文件是.h的相应.c。
答案 1 :(得分:2)
您可以使用转换其输入的xargs:
a
b
c
到参数列表:
a b c
所以这应该打印“a b c”:
echo -e "a\nb\nc" | xargs echo
答案 2 :(得分:2)
ls `ls *.h|sed s/.h/.c/` 2>/dev/null
应该做的伎俩
答案 3 :(得分:1)
ls *.h | sed s/.h/.c/ | xargs ls 2>/dev/null
该命令的其余部分再次使用新的* .c文件名运行ls
。 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
答案 4 :(得分:1)
ls -1 *.c* *.h*|awk -F. '{a[$1]++}END{for(i in a){if(a[i]==2)print i".hh"} }'