特定の名前のディレクトリ内のファイルの数を数える

特定の名前のディレクトリ内のファイルの数を数える

このコードはここで見つかりましたhttps://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.htmlこれにより、ディレクトリ内のファイルの数がわかりやすく表示されます。

ls -1 | wc -l

しかし、私が知りたいのは、ファイル名のうち 2009 で始まるものがいくつあるか (例20091210_005037.nc) だけです。

試してみましたls -1 | wc -l 2009*が、すべてのファイルがゆっくりとリストされ、番号は表示されないようです。

答え1

set -- 2009*
echo "$#"

これは、位置パラメータのリスト ( $1、、$2... など) を に一致する名前に設定します2009*。このリストの長さは です$#


の問題は、に一致するファイルを直接実行し、それぞれの行数をカウントするls -1 | wc -l 2009*ことです。一方、は の標準入力に書き込もうとしますが、には作業対象のファイルの明示的なリストが指定されているため、 からの読み取りは行われません。wc -l2009*ls -1wcwc

を使用したい場合もあるでしょうls -d 2009* | wc -l。これにより、一致するすべての名前がリストされ2009*(ディレクトリの内容をリストしないようlsに を使用-d)、出力の行数がカウントされます。の結果をどこかに-1パイプする場合は、 は不要であることに注意してください (が列出力を強制するエイリアスまたはシェル関数でない限り)。lsls

また、これにより、間違っているファイル名に改行が含まれているかどうかをカウントします。

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

しかし:

$ set -- 2009*
$ echo "$#"
1

(使用setと出力は、$#ほとんどのシェルでは外部コマンドを使用しません)


再帰的にカウントするために使用しますfind:

find . -type f -name '2009*' -exec echo . \; | wc -l

ここでは、現在のディレクトリ内またはその下にある見つかったパス名ごとにドットを出力し、これによって生成される行数をカウントします。ファイル名の文字列自体はカウントしません。ファイル名に改行が含まれている場合に行数が多すぎるのを避けるために、このようにします。

findより厳密に制御できるようになり、タイプカウントするファイルの数。上記では、明示的に通常のファイル(つまり-type f、ディレクトリや他の種類のファイルは含みません)。*シェルのパターンはディレクトリとファイルを区別しませんが、シェルは を使用してパターンの動作を変更し、通常のファイルのみに一致するようにすることzshができます(ユーザーは、上記および下記の以外のバリエーションでの代わりにを使用する可能性が高いでしょう)。*(.)zsh2009*(.)2009*find

**in ( shopt -s globstarin bashset -o extended-globin yash、またはそれをサポートするその他のシェルとともに)を使用して、再帰的にカウントします。

set -- **/2009*
echo "$#"

パターンは**とほぼ同様に一致します*が、/パス名全体でも一致します。

答え2

以下のコマンドを試したところ、問題なく動作し、結果が得られました

   find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

注意: サブディレクトリの下にも置きたい場合は、maxdepthオプションを削除してください。

答え3

コメントをくださった皆様のおかげで、私の質問に対する答えがわかりました。

ls 2009* | wc -l

または検索を使用して

find 2009* | wc -l

答え4

awk を使用して、特定のファイル名で始まるファイルの数をカウントします。

root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is  4

関連情報