
ここでこのコードを見つけました。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 -l
2009*
ls -1
wc
wc
を使用したい場合がありますls -d 2009* | wc -l
。その後、一致する名前をすべて一覧表示し2009*
(リストを表示せls
ずにディレクトリの内容を使用して-d
)、出力の行数を計算します。-1
結果をどこかにパイプする場合、これは必要ありません(ls
列ls
出力を強制するエイリアスやシェル関数でない場合)。
また、これがあなたに与えるでしょう。間違ったファイル名に改行文字が含まれているかどうかを計算します。
$ 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
できます(ユーザーは代わりに上下の非変形利用可能です)。*(.)
zsh
2009*(.)
2009*
find
**
再帰計算を実行するには、in(shopt -s globstar
in bash
、set -o extended-glob
in yash
、またはそれをサポートできる他のシェルと共に)を使用します。
set -- **/2009*
echo "$#"
パターンは**
ほぼ一致します*
が、パス名とも交差一致します/
。
答え2
次のコマンドを試してみました。うまく動作し、結果を得ました。
find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'
注:サブディレクトリでも作業するには、maxlengthオプションを削除してください。
答え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