現在のディレクトリのファイルが8行を超えるたびに増加するシェルスクリプトにカウンタを作成しますか? [閉鎖]

現在のディレクトリのファイルが8行を超えるたびに増加するシェルスクリプトにカウンタを作成しますか? [閉鎖]

現在のディレクトリのファイルが8行を超えるたびに増加するシェルスクリプトからカウンタを生成する方法と2つのリスト(1つは8行を超えるファイルを含み、もう1つは8行を超えるファイルを含む)を生成する方法行。 8行未満の他のファイルがありますか?私はこれを試しましたが、間違っていると確信しています。

contor=0 
while [ contor -le 100 ] 
do 
      echo $contor 
      contor=expr $contor + 1 
done

答え1

#!/bin/bash

shopt -s nullglob dotglob

long_files=()
short_files=()

for name in ./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                long_files+=( "$name" )
        elif [[ numlines -lt 8 ]]; then
                short_files+=( "$name" )
        fi
done

printf 'There are %d files with more than 8 lines:\n' "${#long_files[@]}"
printf '\t%s\n' "${long_files[@]}"

printf 'There are %d files with less than 8 lines:\n' "${#short_files[@]}"
printf '\t%s\n' "${short_files[@]}"

これは、実際にはファイル内の8行より多いか少ないかによって、現在のディレクトリのすべての名前を繰り返し、名前を2つのリスト(配列)long_filesに分割して要求された操作を実行します。short_files正確に8行のファイルはリストに保存されません。-fテストとステートメントは、非伝統的なファイル(ディレクトリなど)に対応する名前をスキップしますcontinue

行数はを使用して計算されるため、ファイル内wc -lの個々の行を計算するためにカウンタを使用する必要はありません。

このスクリプト設定nullglobdotglobシェルオプションを使用すると、完全に空のディレクトリと隠しファイルを正しく処理できます。

最後に2つのリストが出力される。

テスト実行:

$ bash script.sh
There are 1 files with more than 8 lines:
        ./script.sh
There are 3 files with less than 8 lines:
        ./.bash_profile
        ./.bashrc
        ./.zshrc

リストを含む2つのファイルを作成するには、上記のスクリプトの最後にあるファイルにリストを印刷します。

printf '%s\n' "${long_files[@]}"  >long_files.list
printf '%s\n' "${short_files[@]}" >short_files.list

または、配列に名前を追加する代わりに、プログラムのメインループからファイルとして印刷します。

#!/bin/bash

shopt -s nullglob dotglob

rm -f long_files.list short_files.list

for name in ./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                printf '%s\n' "$name" >>long_files.list
        elif [[ numlines -lt 8 ]]; then
                printf '%s\n' "$name" >>short_files.list
        fi
done

到着計算8行より長いファイル数、長いファイルが検出されたときに増加するカウンタ変数を使用するか、長く短いファイルの配列を使用する場合は、"${#long_files[@]}"ループの後の長いファイル数を取得します(最初のコードスニペットと同様)。 )。

関連情報