ディレクトリ内の特定の名前を持つファイル数の計算

ディレクトリ内の特定の名前を持つファイル数の計算

ここでこのコードを見つけました。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 "$#"

パターンは**ほぼ一致します*が、パス名とも交差一致します/

おすすめ記事