非常に単純な質問: ファイルのセットがあるとします:
a1.txt
a2.txt
a3.txt
b1.txt
そして、次のコマンドを使用します。
ls a*.txt
次のように返されます。
a1.txt a2.txt a3.txt
* パターンを使用したときに返される結果の数を bash スクリプトで確認する方法はありますか。上記の例で、*.txt を使用した場合の答えは 3 で、*1.txt を使用した場合の答えは 2 です。
使用に関するコメントls
:
ls
。ファイル名に「特殊な文字」(スペースなど)が含まれていると壊れるため、これは非常に予測不可能です。ls
実装に依存することです。特定の実装では、出力の形式が異なる場合があります。Greg Wooledge によって管理されている bash wikiで、ls 出力を解析する際の落とし穴に関する非常に優れた議論があり ます。
bash 配列を使用したソリューション
上記の理由から、bash 構文を使用する方が信頼性の高いオプションです。グロブを使用して、一致するすべてのファイル名を bash 配列に入力できます。次に、配列の長さを bash に問い合わせて、一致の数を取得できます。次のスニペットが機能するはずです。
files=(a*.txt) && echo "${#files[@]}"
一致数を変数に保存するには、次のようにします。
files=(a*.txt)
count="${#files[@]}"
この方法のもう 1 つの利点は、繰り返し処理できる配列内に一致するファイルがあることです。
注:上記のbash 構文を繰り返しますが、上記の解決策はすべてのshファミリーのシェルに適用されると思います。
前もって知ることはできませんが、返される結果の数を数えることはできます。いえ
ls -l *.txt | wc -l
ls -l
指定されたワイルドカードに一致するディレクトリ エントリが表示されます。 wc -l はカウントを示します。
このコマンドの値は、次のいずれかを使用してシェル変数に保存できます。
num=$(ls * | wc -l)
また
num=`ls -l *.txt | wc -l`
を使用$num
してアクセスします。最初の形式が優先されます。
ls
次のものと組み合わせて使用できますwc
。
ls a*.txt | wc -l
このls
コマンドは、一致するファイルを 1 行に 1 つずつリストし、wc -l
行数をカウントします。
私は suvayu の答えが好きですが、配列を使用する必要はありません:
count() { echo $#; }
count *
改行や印刷できない文字など、予測できない名前を持つ可能性のあるファイルをカウントするには、 andの-print0
オプションを次のように使用します。find
awk
RS='\0'
num=$(find . -maxdepth 1 -print0 | awk -v RS='\0' 'END { print NR }')
オプションを調整find
してカウントを絞り込みます。たとえば、基準が現在のディレクトリ内の小文字で始まりa
拡張子.txt
を持つファイルである場合は、次を使用します。
find . -type f -name 'a*.txt' -maxdepth 1 -print0