bashにプレフィックスを持つ1つ以上のファイルがあるかどうかをテストする方法は?たとえば、[[-f foo*]]

bashにプレフィックスを持つ1つ以上のファイルがあるかどうかをテストする方法は?たとえば、[[-f foo*]]

使用する方法はありますか?ファイル名拡張子test表現する、より具体的には、bash条件式

たとえば、

[[ -f foo* ]] && echo 'found it!' || echo 'nope!';

...出力されます「いいえ!」ファイルがfoobar現在のディレクトリに存在するかどうか。

いいねも追加してvar...

bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';

...出力されます「それを発見!」foobarファイルが存在するが拡張子がecho $barファイルを返す場合にのみ該当します。

ベストアンサー1

以下では、globがブロック特殊ファイル、文字特殊ファイル、ディレクトリ、シンボリックリンクなどを含むすべてのファイルと一致するかどうかに関心がないとします。

これは次の理想的なユースケースですfailglob

shopt -s failglob
if echo foo* &>/dev/null
then
    # files found
else
    # no files found
fi

またはファイルが存在する場合は、リストが必要な場合:

shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
    # no files found
else
    # files found
fi

ファイルが見つからないというエラーが発生した場合は、次のように単純化できます。

set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line

古い回答

lsこれは、スクリプトで(まれに!)正当な用途です。

if ls foo* &>/dev/null
then
else
fi

または、find foo* -maxdepth 0 -printf ''

おすすめ記事