ファイル名を正規表現と一致させる行?

ファイル名を正規表現と一致させる行?

小さなスクリプトがあります。

#!/bin/bash
# test for regular expressions to match...
DIR="/search/path/"
NAME="FOO[0-9][0-9]_<bar|dog|cat>"

for FILE in `find ${DIR} -maxdepth 1 -type f -name "*\.[dD][oO][cC]"` 
do
    BASENAME=`basename ${FILE}`
    FILENAME="${BASENAME%.*}"

    if [[ "${FILENAME}" == ${NAME} ]]
    then
            echo "Found $FILENAME"
    else
            echo "$FILENAME not matching..!"
    fi

done

このスクリプトでは、、、またはFOO[0-9[0-9]_で始まるすべてのファイルを一致させようとします。しかし、またはなどの他のものがある場合は、bardogcatbogcogcarいいえマッチ。

これは[a-z][a-z][a-z]一致します...

私は同様のことを試しました。

NAME="FOO[0-9][0-9]_(bar|dog|cat)"
or
NAME="FOO[0-9][0-9]_bar|dog|cat"
or
NAME="FOO[0-9][0-9]_[bar|dog|cat]"
or
NAME="FOO[0-9][0-9]_'bar|dog|cat'"

ただし、正規表現に関するドキュメントでは正確な一致に関する内容が見つかりません。

私が使用する基本スクリプトははるかに複雑で、さまざまなサブプロセスがかかっているので、1行に入力する必要があります。

これはまだ可能です…?

ベストアンサー1

文字列一致のみを使用するには、次のものを使用する必要があります=~(拡張正規表現一致とともに):

if [[ "${FILENAME}" =~ "FOO[0-9][0-9]_(bar|dog|cat)" ]]

または

NAME="FOO[0-9][0-9]_(bar|dog|cat)"
if [[ "${FILENAME}" =~ ${NAME} ]]

元のバージョンと一致するようにします。

==常にワイルドカードの一致(またはワイルドカードが無効になっている場合は正確な一致)であり、正規表現では使用できません。

または、GNUを使用すると想定してスクリプトをさらに変更できる場合は、次のようにfindフィルタリングできますfind

find ${DIR} -maxdepth 1 -type f -regextype posix-extended -regex ".*/FOO[0-9][0-9]_(bar|dog|cat)\.[Dd][Oo][Cc]"

(拡張正規表現を使用するように-regextype posix-extended指示すると、find正規表現自体はファイル名だけでなくフルパスと一致する.*/ためで始まります。)-regex

おすすめ記事