ls在目录中的文件列表

时间:2012-10-25 06:25:43

标签: linux shell unix ls

我有一个C代码库,它们都驻留在同一个目录中。 我想找到所有具有相同名称的代码文件的头文件。

现在,我有以下命令:

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

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

5 个答案:

答案 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文件名运行lsls会抱怨每个不存在的文件,因此我们将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"} }'