我有一個C代碼庫,全部駐留在同一個目錄中。 我想找到所有具有相同名稱的代碼文件的頭文件。ls在文件列表的目錄中
現在,我有以下命令:
ls *.h | sed s/.h/.c/
這會返回一個我要搜索文件名的名單「。如何將這個列表傳遞給另一個命令,以便我可以看到哪些頭文件具有共享相同名稱的代碼文件?
我有一個C代碼庫,全部駐留在同一個目錄中。 我想找到所有具有相同名稱的代碼文件的頭文件。ls在文件列表的目錄中
現在,我有以下命令:
ls *.h | sed s/.h/.c/
這會返回一個我要搜索文件名的名單「。如何將這個列表傳遞給另一個命令,以便我可以看到哪些頭文件具有共享相同名稱的代碼文件?
在沒有任何外部命令:
$ for i in *.h
> do
> [ -f ${i/.h/.c} ] && echo $i
> done
第一行通過每個文件循環。
第三行是一個測試構造。 -f
標誌到test
(又名man [
)將檢查文件是否存在。如果是,則返回0
(在shell中認爲是true)。如果上一行成功返回,則&&
僅在以下命令中運行。
$ {i/.h/.c}是一個in-place in-shell正則表達式替換,因此測試的文件與.h相對應.c。
啊,那個時候提供的不是要求的東西,而是需要的東西! –
@JeffFerland:你爲什麼要把$?它沒有給出正確的結果$。 – Guru
我把'$'錨定到行尾。在實踐中,沒有人會有.h.h文件,這是一種很好的形式。當然,既然它打破了你的話,那麼就有一些與外殼有關的東西。我會將其退出,儘管它對我有用。 –
,你可以使用的將其輸入xargs的:
a
b
c
參數列表:
a b c
所以這應該打印 「ABC」:
echo -e "a\nb\nc" | xargs echo
ls `ls *.h|sed s/.h/.c/` 2>/dev/null
應該做的伎倆
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
ls -1 *.c* *.h*|awk -F. '{a[$1]++}END{for(i in a){if(a[i]==2)print i".hh"} }'
哇,謝謝大家。我會採取最簡單的答案,但我感謝你的幫助。 – Pablo