現在のディレクトリのファイルが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
の個々の行を計算するためにカウンタを使用する必要はありません。
このスクリプト設定nullglob
とdotglob
シェルオプションを使用すると、完全に空のディレクトリと隠しファイルを正しく処理できます。
最後に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[@]}"
ループの後の長いファイル数を取得します(最初のコードスニペットと同様)。 )。