2017-01-21 68 views
2

我還需要目錄名稱作爲輸出。我能做的就是輸出所有目錄中具有目錄名稱的總行數。如何統計文件的所有行

find . -name '*.c' | xargs wc -l | xargs -I{} dirname {} | xargs -I{} dirname {} 
+0

你能有一個適當的例子再次重申您的要求?你能詳細解釋一下嗎? – Inian

+0

@Inian,基本上我想擁有目錄路徑和該目錄中以分號結尾的行數(該目錄中所有文件的行數)。我可以用'find'輸出在目錄中以分號結尾的行的總數。 -name'* .c'-print0 | xargs -0 grep'[;] $'| wc -l',但我不知道如何通過目錄獲取輸出。 – Theseven7

+0

@Inian,做到了。 – Theseven7

回答

0

我已經混亂了bash命令的混合物大多GNU特異性,請確保您有他們,GNU grepGNU Awk

find . -type f -print0 | xargs -0 grep -c ';$' | \ 
    awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 

的想法是grep -c返回格式,file-name:count模式計數,對此我將它傳遞給GNU Awk以過濾那些計數大於零的文件,並打印包含它的文件的目錄和計數本身。

由於他們稱之爲這幾天看上一個內膽,

find . -type f -print0 | xargs -0 grep -c ';$' | awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 
+0

做這份工作!感謝您的解釋。 – Theseven7

0

這裏是一個腳本:

#!/usr/bin/env bash 

for dir in */; do (
    cd "$dir" 
    count=$(find . -name '*.c' -print0 | xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

如果你想爲每個子目錄編號:使用

#!/usr/bin/env bash 

for dir in $(find . -type d); do (
    cd "$dir" 
    count=$(find . -maxdepth 1 -name '*.c' -print0 | \ 
     xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

-maxdepth 1確保計算僅在當前目錄下完成的,而不是其子目錄。所以每個文件都被計算一次。

+0

有沒有辦法修改循環來查看子目錄呢? – Theseven7

+0

增加了另一個腳本。 –

相關問題