計算檔案系統樹中字元的出現次數

計算檔案系統樹中字元的出現次數

任務是尋找目錄中所有檔案中字元「a」的出現次數(遞歸)。

我的腳本是這樣的

find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l

但它失敗了:即使在我的本地計算機上它也能工作,我也得到了結果 0。

這個腳本有什麼問題?我猜它不是防彈的或什麼的。我怎樣才能使它防彈或正確?

答案1

我的猜測是有問題的機器grep不支援-o。

如果是這種情況,那麼您的命令列每次findexecs都會產生錯誤訊息grep。然而,隨著標準錯誤重定向到 /dev/null,人們的呼聲被置若罔聞。

wc沒有接收到單一位元組,導致行計數為 0,因為grep立即退出。

嘗試在不使用 stderr 重定向或重定向到日誌檔案的情況下運行管道。如果我是正確的,您應該會看到由 找到的每個文件一條錯誤訊息find

如果您發現它有用,這裡有一個不使用的替代方案grep

find . -type f -exec cat {} \; | tr -cd a | wc -m

如果您find支援更有效的+執行替代方案:

find . -type f -exec cat {} + | tr -cd a | wc -m

答案2

我這樣做了:

find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l

這與您的命令幾乎相同,並且得到非零結果。您是否在您認為的目錄中?你真的在尋找嗎a?如果沒有,我建議grep -F(正如我所使用的那樣)或fgrep搜尋固定字串而不是正規表示式。

您可以使用grep -r(遞歸 grep)進一步簡化:

grep -Fro 'a' "${directory-.} | wc -l

不幸的是,你無法grep進行計數,因為grep -o -c計數行而不是出現次數 - 我認為這是一個錯誤。

相關內容