Bashの拡張グロブ(extglob
)の解決策:
bash -c $'shopt -s extglob \n /bin/ls -1U <ext-glob-pattern>'
終了ステータスは、一致するものが1つ以上ある場合は0、一致しない場合はゼロ以外(2)です。標準出力には、一致するファイル(および引用符で囲まれたスペースを含むファイル名)の改行で区切られたリストが含まれます。
または、わずかに異なります:
bash -c $'shopt -s extglob \n compgen -G <ext-glob-pattern>'
ベースのソリューションとの違いls
:おそらくより高速(測定されていない)、出力で引用符で囲まれていないスペースを含むファイル名、一致しない場合(2:shrug:)でコード1を終了します。
使用例:
歯が立たない:
$ bash -c $'shopt -s extglob \n /bin/ls -1U @(*.foo|*.bar)'; echo "exit status: $?"
/bin/ls: cannot access '@(*.foo|*.bar)': No such file or directory
exit status: 2
少なくとも1つの一致:
$ bash -c $'shopt -s extglob \n /bin/ls -1U @(*.ts|*.mp4)'; echo "exit status: $?"
'video1 with spaces.mp4'
video2.mp4
video3.mp4
exit status: 0
使用される概念:
ls
'終了コードの動作(効率と出力制御のため-U
に追加)。-1
extglob
現在のシェルでは有効になりません(多くの場合、望ましくありません)。
$
プレフィックスを使用して、\n
が解釈されるようにします。これにより、拡張グロブパターンが-とは異なる行にshopt -s extglob
表示されます。そうしないと、拡張グロブパターンが構文エラーになります。
注1:他の回答で提案されているアプローチは、ブレースの拡張compgen -G "<glob-pattern>"
ではスムーズに機能しないように思われるため、このソリューションに取り組みました。それでも、より高度なグロブ機能が必要でした。
注2:拡張グロブ構文の素敵なリソース:extglob