forループを使用して、現在のディレクトリにある各ファイルの行数を計算しますか?

forループを使用して、現在のディレクトリにある各ファイルの行数を計算しますか?
  • 引数が入力として提供される場合、スクリプトはその入力ファイルの行数のみを確認する必要があります。そうでない場合、スクリプトはそのディレクトリ内の各ファイルの行数を表示する必要があります。
  • スクリプトファイルは無視する必要があります。つまり、スクリプトファイルの数を表示しないでください。

私は試した:

#!/bin/bash
if [ $# -eq 0 ]
then
        for l in *.txt
        do
                echo $(wc -l $l)
        done
else
        for l in $*
        do
                echo $(wc -l $l)
        done
fi

ただし、ファイル形式(例:* .txt)を明示的に言及することは許可されていません。スクリプトファイルを除くすべてのファイルを確認する必要があります。

答え1

ほとんど理解していると思います。あなたはbasename "$0"それを使用することができますスクリプト内のスクリプト名の検索を除くすべての項目の行数を印刷します。

#!/bin/bash
if [ $# -eq 0 ]
then
    for k in *
    do
        if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
        then
            wc -l "$k"
        fi
    done
else
    for k in $*
    do
         wc -l "$k"
    done
fi

私は自由を取る

  • k代わりに使用してくださいl(変数名にはお勧めできません。リンクが見つかりませんがわかります(、1と混同される可能性がありますI))。
  • インデントには8つのスペースではなく4つのスペースを使用します。もちろん、最終決定はあなたの分け前ですが、8つより4つのスペースがより読みやすいと言いたいです。
  • 変数を参照してください。変数名をスペースで区切らないことをお勧めします。
  • echo@Sergが指摘したように、不要なコンテンツを削除します。

編集するif条件だけでなく、それを無視するために二重括弧とディレクトリテストを追加しました。

答え2

#!/bin/bash

if [[ "$#" != 0 ]]; then
  # only process the names given to us
  wc -l "$@"
  exit
fi

# process all regular files in this directory, avoiding this script
for f in ./*; do
    if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
        wc -l "$f"
    fi
done

答え3

スクリプトに加えて、3つのコマンドを1行にまとめて目的の結果を印刷できます。
例えば。

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

現在のディレクトリでのみ検索せずに行数を再帰的に計算したい場合は、「-maxlength 1」スイッチを削除するか、必要に応じて数値を変更できます。

関連情報