すべての.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
は、パイプを介して渡されたリストを読むために非標準オプションと一緒に使用されます。