すべての.txtファイルの総行数を計算する方法は?

すべての.txtファイルの総行数を計算する方法は?

すべての.txtファイルから総行数を取得する方法を見つけようとしています。問題は6 - >行にあると思いますlet $((total = total + count ))。もしこれの正しい形が何なのかご存知の方ですか?

#!/bin/bash
total=0
find /home -type f -name "*.txt" | while read -r FILE; do
          count=$(grep -c ^ < "$FILE")
           echo "$FILE has $count lines"
           let $((total = total + count ))
        done
        echo TOTAL LINES COUNTED:  $total

ありがとう

ベストアンサー1

6行目は次のように書く方が良いです。

total=$(( total + count ))

...しかし、ツールを使用する方が良いです生産行数の計算(改行数、つまり正しく終了した行を計算すると仮定)

find . -name '*.txt' -type f -exec cat {} + | wc -l

これは現在のディレクトリまたはその下にあるファイルを探します.txt。これらのファイルはすべてストリームにリンクされ、にパイプされ、wc -l質問の件名とテキストに必要な行の総数を出力します。

フルスクリプト:

#!/bin/sh

nlines=$( find . -name '*.txt' -type f -exec cat {} + | wc -l )

printf 'Total number of lines: %d\n' "$nlines"

各ファイルの行数を同時に取得するには、次の点を考慮してください。

find . -name '*.txt' -type f -exec sh -c '
    wc -l "$@" |
    if [ "$#" -gt 1 ]; then
        sed "\$d"
    else
        cat
    fi' sh {} + |
awk '{ tot += $1 } END { printf "Total: %d\n", tot }; 1'

これはwc -lバッチファイルを呼び出して個々のファイルの行数を出力します。複数のファイル名で呼び出すと、wc -l最後に総数を含む行が出力されます。インラインスクリプトが複数のファイル名引数を使用して呼び出されるsed場合は、この行を削除します。sh -c

その後、行数とファイルパス名の長いリストを渡すと、数が追加されawk(データが渡され)、最後に合計数がユーザーに表示されます。


GNUシステムでは、このwcツールはヌルで区切られたストリームからパス名を読み取ることができます。次のように、これらのシステムでこの機能findとそのタスクを使用できます。-print0

find . -name '*.txt' -type f -print0 |
wc --files0-from=- -l

wcここで見つかったパス名は、非標準を使用するために空の区切りリストにパイプされます-print0。このwcユーティリティ--files0-fromは、パイプを介して渡されたリストを読むために非標準オプションと一緒に使用されます。

おすすめ記事