
ディレクトリ内にファイルのリストがあり、その中のすべてのファイル名が次の構文であるかどうかを正規表現を使用してチェックする bash スクリプトを作成したいと考えています。
xxxx_xxxx_xx_xx
ここで、x は数字です。
編集:正規表現だけが必要です
答え1
いかがでしょうか
#/usr/bin/env bash
for f in *
do
[[ $f =~ [0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2} ]] ||
echo "File $f does not match"
done
正規表現は任意の数字 ( [0-9]
) をチェックします。中括弧内の数字は繰り返し回数なので、[0-9]{4}
任意の 4 桁の数字と一致します。
この場合は bash ではなく find を使用することをお勧めします。おそらくより高速で、移植性も確実に高くなります (すべてのシェルが正規表現を処理できるわけではありません)。
find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'
答え2
扱いにくいですが、これは非常に移植性が高いはずです:
#!/bin/sh x が * の場合 する ケース「$x」 [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9]_[0-9][0-9]) echo "$x が一致しました" ;; *) echo "$x は一致しません" エサック 終わり # そして、面倒なことに、 x の場合 .* する echo "$x は一致しません" 終わり