1. ホーム
  2. shell

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

2022-03-16 08:19:45

質問

あるファイルが存在するかどうかを、ワイルドカードを使ってチェックしようとしています。以下は私の例です。

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

ダブルクォーテーションなしでも試してみました。

どのように解決するのですか?

Bashスクリプトの場合、最も直接的でパフォーマンスの高い方法があります。

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

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

ソース


最もシンプルなのは ls の戻り値(ファイルが存在しない場合は0以外を返します)。

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

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


同じくグロブ展開に依存する最適化であるが、これは 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さんの回答 しかし、リスト全体の不要な反復を避けることができます。