質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

1226閲覧

shellのwhileについて

pbdev

総合スコア21

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/09/12 06:32

業務で初めてshellを触ることになりましたが、わからない箇所がいくつかあります。
とあるパスにとある形式のファイルが存在する数だけループを回す
==例==
※形式:sample.yyyymmdd.flg
実ファイル:sample.20180912.flg
実ファイル:sample.20180913.flg
※形式の実ファイルの数だけfor文?while文?どちらでもいいのでとにかく
形式のに合致する実ファイルの数だけループさせたいです。

説明が下手ですみません。
どなたか回答お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問のタイトルとは反しますが、自分がちょっと思いついたものとしては、

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
に該当するファイルを抽出します。

| (パイプライン処理)

shell

1|

次にこの縦棒記号ですが、これは「次に書くコマンドに出力結果を渡す」というものです。
シェルスクリプトの「使いこなすと超便利機能」です。

grep

shell

1grep -e ".*sample.[0-9]\{8\}.flg"

こちらは grep という「文字列検索コマンド」です。
このコマンドのすごいところは、正規表現が使えることです。(他にもありますが)

普段は「指定されたファイル内の文字列を検索する」用途で使われることが多いですが、今回は前のコマンド find の結果を受け取っているため、そこに書き込まれているファイル一覧から、正規表現を使用し、
「何らかの文字が0個以上繰り返された文字の後に、 sample. という文字列の後に数字が8つ並び、その後ろで .flg と書かれている行を取得する」
ということをしています。

そして、この結果をパイプライン処理を使用し、次のコマンドへ結果を受け渡しします。

wc

shell

1wc -l

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:03

編集2018/09/12 07:18
manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manzyun

2018/09/12 07:09

ごめんなさい。対象のファイルを「数えたい」のではなくて、「処理を行いたい」のでしたね……。ちょっと回答に加筆します。
pbdev

2018/09/12 07:26

わかりやすい解説ありがとうございます。 ちなみにですが、$flg の中には何が入るのでしょうか?
manzyun

2018/09/12 07:31

$figの中には、inの右側に書いたコマンドの結果が1個1個入ってきます。 なお、今回のように「配列っぽいデータ(というぼかした表現ですみません)」は「イテレーター」と言ったりします。この仕組が分かると、シェルスクリプトでできることが幅広くなる気がします。
pbdev

2018/09/12 07:33

理解できました。 ありがとうございます! ベストアンサーにさせていただきます。
guest

0

数字8桁を含むと言う事であれば、

sh

1for file in sample.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].flg 2do echo $file 3done

です。
正規表現じゃないので、8回書かないといけないけど、正規表現が使えるコマンドと組み合わせるよりは簡単でしょう。

投稿2018/09/12 07:10

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pbdev

2018/09/12 07:16

回答ありがとうございます。 do echo $file ではファイル名が表示されるのでしょうか?
otn

2018/09/12 07:22

そうです。echoは引数を表示するコマンドです。
guest

0

完全に思いつきですいません。処理が何をするかわからないですが
/hoge下にある頭がsampleで末尾flgのファイルを表示するみたいなことであれば

for i in /hoge/sample.*.flg
do
echo ${i}
done

ファイル名が表示されますけども頭がsampleで末尾flgとなっている
ファイル数分だけループしますネ

こんな感じでいいですか?

投稿2018/09/12 06:47

0364649.com

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pbdev

2018/09/12 06:54

回答ありがとうございます。 sample .aaa.flgでも上記の場合ループしてしまうため今回のさせたい処理とは少し異なっています。 for文の書き方については勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問