2015-07-01 68 views
1

我在構建一個小bash腳本來運行在多個目錄中找到的另一個bash腳本。這裏的代碼:Bash grep命令找到同一個文件5次

cd /home/mainuser/CaseStudies/ 

grep -R -o --include="Auto.sh" [\w] | wc -l 

當我只執行該部分,它在每個文件夾中找到相同的文件5次。因此,與其讓49分的結果,我得到245我以前也寫過一個遞歸bash腳本,我用它作爲這個問題的模板:

grep -R -o --include=*.class [\w] | wc -l 

此代碼一直非常完美,沒有任何重複。我嘗試了運行第一個代碼,但沒有運行「」,我也嘗試過了。我已經閱讀了bash文檔,似乎無法找到一種方法來防止,或者甚至爲什麼我會得到這種重複。有關如何解決這個問題的任何想法?

作爲一個獨立但相關的問題,如果我可以在每個目錄內部啓動Auto.sh,以便將Auto.sh的輸出轉儲到該目錄中;而不必在每個文件夾中放置Auto.sh。這可能會更有效率,我目前正在做的事情,它也可能會解決我目前的重複問題。

這是Auto.sh代碼:

#!/bin/bash   
index=1 
cd /home/mainuser/CaseStudies/ 
grep -R -o --include=*.class [\w] | wc -l 
grep -R -o --include=*.class [\w] |awk '{print $3}' > out.txt 

while read LINE; do 
    echo 'Path '$LINE > 'Outputs/ClassOut'$index'.txt' 
    javap -c $LINE >> 'Outputs/ClassOut'$index'.txt' 
    index=$((index+1)) 
done <out.txt 

最好,我想使它只輸出javap的輸出,其目前正在研究中的應用。由於這些.class文件可能位於任意數量的子目錄中,我不知道如何將它們全部轉儲到頂層文件夾中,而不必在每個應用程序的頂層目錄中執行修改的Auto.sh。

+0

嘗試引用''[\ w]''模式?另外,如果'Auto.sh'將其輸出寫入當前目錄,那麼肯定可以避免擁有49個文件副本。只需'pushd $ dir; /abs/path/to/Auto.sh;彈出「在目錄中的循環。 –

+0

添加''的數字已增加到343.這意味着它現在在每個目錄中找到兩個額外的條目。我應該對第二個問題更具體一些。 Auto.sh遍歷每個子目錄,並對每個找到的.class文件執行一個javap函數。它目前將所有內容輸出到一個文件夾,但我想通過應用程序分解輸出。所以我想在應用程序的頂層目錄中執行它,並將該應用程序的所有javap信息輸出到應用程序頂層目錄中的單個文件夾中。我可以發佈上面的Auto.sh代碼。 – TheNoviceAllen

+3

'-o'會打印出每個匹配,所以你確定這個模式不合法匹配5次?如果你只是想知道哪些文件有匹配,你可以使用'-l'而不是'-o' –

回答

0

好了,所以修復多個查找:

grep -R -o --include="Auto.sh" [\w] | wc -l 

應該是:

grep -R -l --include=Auto.sh '\w' | wc -l 

這是發生的原因,是它一直在尋找W的自動信件的實例。 SH。在文件中發生了5次。

然而,這並不需要有放置Auto.sh在每個目錄下的整體修復,是這樣的:

MAIN_DIR=/home/mainuser/CaseStudies/ 

cd $MAIN_DIR 

ls -d */ > DirectoryList.txt 

while read LINE; do 
    cd $LINE 
    mkdir ProjectOutputs 
    bash /home/mainuser/Auto.sh 
    cd $MAIN_DIR 
done <DirectoryList.txt 

調用此Auto.sh代碼:

index=1 

grep -R -o --include=*.class '\w' | wc -l 
grep -R -o --include=*.class '\w' | awk '{print $3}' > ProjectOutputs.txt 

while read LINE; do 
    echo 'Path '$LINE > 'ProjectOutputs/ClassOut'$index'.txt' 
    javap -c $LINE >> 'ProjectOutputs/ClassOut'$index'.txt' 
    index=$((index+1)) 
done <ProjectOutputs.txt 

再次感謝大家的幫助!