質問のタイトルとは反しますが、自分がちょっと思いついたものとしては、
shell
1find . -type f -name "sample.*.flg" | grep -e ".*sample.[0-9]\{8\}.flg" | wc -l
はどうでしょう?
解説
find
shell
1find . -type f -name "sample.*.flg"
指定されたディレクトリからファイルやディレクトリを検索するコマンド find で、まず sample.(なんちゃら).flg
に該当するファイルを抽出します。
| (パイプライン処理)
次にこの縦棒記号ですが、これは「次に書くコマンドに出力結果を渡す」というものです。
シェルスクリプトの「使いこなすと超便利機能」です。
grep
shell
1grep -e ".*sample.[0-9]\{8\}.flg"
こちらは grep という「文字列検索コマンド」です。
このコマンドのすごいところは、正規表現が使えることです。(他にもありますが)
普段は「指定されたファイル内の文字列を検索する」用途で使われることが多いですが、今回は前のコマンド find の結果を受け取っているため、そこに書き込まれているファイル一覧から、正規表現を使用し、
「何らかの文字が0個以上繰り返された文字の後に、 sample. という文字列の後に数字が8つ並び、その後ろで .flg と書かれている行を取得する」
ということをしています。
そして、この結果をパイプライン処理を使用し、次のコマンドへ結果を受け渡しします。
wc
Word Countの省略の wc コマンドは、文字の数を数えるコマンドですが、オプションに -l をつけてあげると、行数をカウントすることができます。
これで「該当する名前のファイル数を数える」という事ができます。
役立つ資料
質問の直接の回答
さて、ここまででシェルスクリプトのお作法が何となくわかったと思うので、for文を使ってみましょう。
shell
1for flg in `find . -type f -name "sample.*.flg" | grep -e ".*sample.[0-9]\{8\}.flg"`
2do
3 printf "%s is flag ;)\n" $flg
4done
と、長くなりましたが、こんな感じでできるはずです。
シェルスクリプト(PowerShellも含む)は、ちょっとマウスでポチポチやりたくない時に重宝しますので、知っておくと役に立ちますよ!
2018/09/12 07:09
2018/09/12 07:26
2018/09/12 07:31
2018/09/12 07:33