シェルスクリプトでワイルドカードを使用してファイルが存在するかどうかを確認する [重複] 質問する

シェルスクリプトでワイルドカードを使用してファイルが存在するかどうかを確認する [重複] 質問する

ファイルが存在するかどうかワイルドカードを使って確認しようとしています。例を以下に示します。

if [ -f "xorg-x11-fonts*" ]; then
    printf "BLAH"
fi

二重引用符なしでも試してみました。

ベストアンサー1

Bash スクリプトの場合、最も直接的でパフォーマンスの高いアプローチは次のとおりです。

if compgen -G "${PROJECT_DIR}/*.png" > /dev/null; then
    echo "pattern exists!"
fi

これは、数百万のファイルがあるディレクトリでも非常に高速に動作し、新しいサブシェルを必要としません。

ソース


最も単純なのは、戻り値に頼ることですls(ファイルが存在しない場合はゼロ以外の値を返します)。

if ls /path/to/your/files* 1> /dev/null 2>&1; then
    echo "files do exist"
else
    echo "files do not exist"
fi

出力をリダイレクトしてls完全に無音にしました。


以下は、glob 拡張にも依存しますが、 の使用を避ける最適化ですls

for f in /path/to/your/files*; do

    ## Check if the glob gets expanded to existing files.
    ## If not, f here will be exactly the pattern above
    ## and the exists test will evaluate to false.
    [ -e "$f" ] && echo "files do exist" || echo "files do not exist"

    ## This is all we needed to know, so we can break after the first iteration
    break
done

これは、grok12 の回答ただし、リスト全体にわたる不必要な反復処理は回避されます。

おすすめ記事