2

非常に単純な質問: ファイルのセットがあるとします:

a1.txt
a2.txt
a3.txt
b1.txt

そして、次のコマンドを使用します。

ls a*.txt

次のように返されます。

a1.txt a2.txt a3.txt

* パターンを使用したときに返される結果の数を bash スクリプトで確認する方法はありますか。上記の例で、*.txt を使用した場合の答えは 3 で、*1.txt を使用した場合の答えは 2 です。

4

5 に答える 5

5

使用に関するコメントls:

  1. の出力を解析することで、他のすべての回答がこれを試みていることがわかります ls。ファイル名に「特殊な文字」(スペースなど)含まれていると壊れるため、これは非常に予測不可能です。
  2. 別の落とし穴は、ls実装に依存することです。特定の実装では、出力の形式が異なる場合があります。

Greg Wooledge によって管理されている bash wikiで、ls 出力を解析する際の落とし穴に関する非常に優れた議論があり ます。

bash 配列を使用したソリューション

上記の理由から、bash 構文を使用する方が信頼性の高いオプションです。グロブを使用して、一致するすべてのファイル名を bash 配列に入力できます。次に、配列の長さを bash に問い合わせて、一致の数を取得できます。次のスニペットが機能するはずです。

files=(a*.txt) && echo "${#files[@]}"

一致数を変数に保存するには、次のようにします。

files=(a*.txt)
count="${#files[@]}"

この方法のもう 1 つの利点は、繰り返し処理できる配列内に一致するファイルがあることです。

注:上記のbash 構文を繰り返しますが、上記の解決策はすべてのshファミリーのシェルに適用されると思います。

于 2012-07-22T23:33:26.090 に答える
4

前もって知ることはできませんが、返される結果の数を数えることはできます。いえ

  ls -l *.txt | wc -l

ls -l指定されたワイルドカードに一致するディレクトリ エントリが表示されます。 wc -l はカウントを示します。

このコマンドの値は、次のいずれかを使用してシェル変数に保存できます。

  num=$(ls * | wc -l)

また

  num=`ls -l *.txt | wc -l`

を使用$numしてアクセスします。最初の形式が優先されます。

于 2012-07-22T22:35:33.307 に答える
3

ls次のものと組み合わせて使用​​できますwc

ls a*.txt | wc -l

このlsコマンドは、一致するファイルを 1 行に 1 つずつリストし、wc -l行数をカウントします。

于 2012-07-22T22:35:14.057 に答える
2

私は suvayu の答えが好きですが、配列を使用する必要はありません:

count() { echo $#; }
count *
于 2012-07-24T21:13:08.217 に答える
1

改行や印刷できない文字など、予測できない名前を持つ可能性のあるファイルをカウントするには、 andの-print0オプションを次のように使用します。findawkRS='\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
于 2012-07-23T00:09:03.123 に答える