2

私のタスクの1つは、特定の日付パターンに一致するファイルの数を数えることです。本当に私がする必要があるのは、ディレクトリをループし、各ファイル名を調べ、そのファイル名の2番目のピリオドを見つけてから、次の4文字を調べて、組み立てている日付文字列に一致するものがあるかどうかを確認することです。

2012年11月は「1211」と表示されます。以下のファイル名の2番目のピリオドの後の最初の4文字を使用すると、最初のファイル名( "o.tt.121113150804")がそのパターンに一致するため、ヒットします。そのファイルを数えて、他の2つはそのままにしておきます。

以下のファイルは単なるサンプルです。それらは多くの異なる方法で名前を付けることができます。それらは通常、99%未満の時間の単なるバリエーションです。2つのピリオドがあり、2番目のピリオドの後に4桁をチェックする必要があるという事実は、確かな定数です。

確認する必要のあるファイル名:

o.tt.121113150804
o.stpw.101209092541
i.rtat.120831045704
4

3 に答える 3

4

これは単独で行うことができますlsが、これはディレクトリにも一致します。

$ ls
i.rtat.120831045704  o.stpw.101209092541  o.tt.121113150804

$ ls *.*.1121*
o.tt.121113150804

ただしfind、より強力で柔軟性があります。

$ find . -maxdepth 1 -type f -iname "*.*.1211*"
./o.tt.121113150804

オプション:

-maxdepth 1このディレクトリだけを見てください。

-type fディレクトリではなく、ファイルのみを検索します。

-inameパターンを使用してファイル名を照合します。ファイル名は何かに*一致するため、何かに*.*.1211*一致し、.その後に何かが続き、次に秒.が続き、日付文字列などが続き*ます。

編集:

一致の数をカウントするには、パイプをwc -l使用してコマンド置換$(...)を使用し、値を変数に格納します。

$ ls
i.rtat.120831045704  o.stpw.101209092541  o.tt.121113150804  
o.tt.121113150804c1  o.tt.121113150804c2

$ find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l
3

$ found=$(find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l)

$ echo $found
3
于 2012-12-14T18:40:47.233 に答える
1

パターンは、固定文字列の前に2つ以上のドットが*.*.1211*あるファイルと一致することに注意してください。たとえば、一致します。a.b.c.1211

bashを使用すると、次のように書くことができます。

shopt -s extglob
ls  +([^.]).+([^.]).1211*

それらを数えたいだけの場合:

files=( +([^.]).+([^.]).1211* )
echo "${#files[@]} files matched"
于 2012-12-14T20:37:37.203 に答える
0

@sudo_Oと@glennjackmanがあなたの質問に答えましたが、代わりに、すべての日付のカウントを一度に取得したい場合は、

ls | awk -F'.' '{count[substr($3,1,4)]++} END{for (date in count) print date, count[date]}'
于 2012-12-14T22:50:57.300 に答える