2016-02-26 66 views
1

我有一個名爲../words的目錄,其中包含一些子目錄(單詞/ blabla,words/blabla),每個子目錄又包含兩種類型的文件(。 * 1.txt)和(。* 2.txt)。我需要的是對這些文件中的每一個執行AWK腳本。遍歷子目錄並針對某些文件執行awk腳本

它可能是類似的東西?

for d in words/* 
do 
    for f in .*[0-9].txt 
    do 
    awk -f script.awk ${f} 
    done 
done 
+1

那麼你試過嗎?問題是你沒有使用'$ d'。你也可以使用'find'命令。 – cdarke

回答

0

如果你想保持你的for語句結構和應用awk腳本到每個指定文件,你可以做到以下幾點:

for file in $(find words -type f -name ".*[12].txt"); do 
    awk -f script.awk "$file" 
done 

find命令對遞歸查看目錄中的任何文件模式很有用。


編輯:如果你的文件名包含的東西,如空格,上面的腳本可能無法正確處理它們,所以你可以做以下代替:

find words -type f -name ".*[12].txt" -print0 | while read -d $'\0' file 
do 
    awk -f script.awk "$file" 
done 

或使用xargs的:

find words -type f -name ".*[12].txt" -print0 | xargs -0 awk -f script.awk 

這使您可以使用空\0字符分隔文件名,因此名稱間距或其他特殊字符ters不會成爲問題。 (你可以在這裏找到更多的信息:Filenames with spaces breaking for loop, and find command,或在這裏:Handling filenames with spaces,或在這裏:loop through filenames returned by find)。

+0

不要爲'$(whatever)中的文件做',因爲各種文件名(如包含空格的文件名)失敗。總是做任何|而IFS =讀取-r文件'而不是甚至更好'無論| | xargs'。 –

+1

你是對的!我上面做了一個修改,以便按照您的建議提供替代方案。 – assefamaru

+0

@EdMorton:對於某些文件名,這些建議仍然存在問題。 (請注意,文件名甚至可以包含換行符。) – ruakh

1

鑑於你告訴我們,到目前爲止,這應該是所有你需要:

awk -f script.awk ../words/blabla/.*[12].txt 
+0

我不知道。如果所有文件都在一次調用中傳遞,那麼'script.awk'可能真誠地表現不同,而如果每個文件都是在單獨調用中傳遞的。 – ruakh

+0

當然,還有其他一些考慮因素,但是OP沒有給我們提供什麼'script.awk'的功能,也沒有提供任何示例輸入或預期輸出,或者甚至沒有提供她的目錄結構的具體表示 - 因此「根據你所說的我們到目前爲止「 –

0

如果您需要跳過中間目錄平,就看你可以用最大的子目錄下/分鐘深度

$ find words -maxdepth 2 -mindepth 2 -type f -name '*[0-9].txt' | xargs awk -f ... 
+1

是的,管道後沒有注意。固定。 – karakfa

相關問題