2013-05-18 34 views
-1

我需要一個參數,它是當前目錄的一個目錄,並搜索其文件夾並編譯這些文件夾中的任何C文件。我剛剛在Bash開始編寫shell腳本,並且稍微超過了我的腦海。如何搜索.c文件的子目錄並編譯它們(shell腳本)

到目前爲止,我嘗試過的東西包括使用find來搜索文件,然後將其傳遞給xargs進行編譯,但不斷收到錯誤,指出testing.c不是目錄。

find ~/directory -name *.c | xargs gcc -o testing testing.c 

我也試着LS-R來搜索文件夾.c文件,但不知道如何再取路徑作爲參數傳遞給再移動到和編譯?

+0

...將它們全部編譯成單個對象? –

+5

爲這類任務編寫一個makefile。 – shx2

+0

不,我不希望他們一起編譯Ignacio,所以我現在看到現在不管用。我有一個快速的makefile shx2谷歌,但不認爲這是一個選項。問題是爲了一個任務,只是要求一個腳本。 我想我需要採取ls的輸出,並做一個if語句來檢查是否確實有.c文件,然後移動該目錄並編譯它們。那麼我會走在正確的軌道上嗎? – blisteringbarnacles

回答

0
find directory -type f -name "*.c" -exec sh -c \ 
    'cd $(dirname $1);make $(basename $1 .c)' sh {} \; 
+0

我不認爲你需要在'{}'之前'sh'。 –

+0

@JonathanLeffler有些東西需要放在這裏纔會變成$ 0,這會讓人混淆爲dirname和basename參數。爲清晰起見,我使用'sh',但它可以是任何字符串。 – jlliagre

+0

好的 - 足夠公平......你似乎是正確的,你可以指定'$ 0'以及其他參數,並且'sh'至少與'$ 0'一樣是一個很好的值,並且比大多數。 –

2
find ~/directory -type f -name "*.c" -print0 | 
while IFS= read -r -d '' pathname; do 
    gcc -o "${pathname%.c}" "$pathname" 
done 
0

正如@ shx2建議,使用make(或其他一些構建系統)將可以說是最好的辦法。如果沒有適當的構建系統,您不想編譯某些源代碼樹中的文件。

相關問題